精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

深入Objective-C的動態特性

開發 后端
Objective-C具有相當多的動態特性,基本的,也是經常被提到和用到的有動態類型(Dynamic typing),動態綁定(Dynamic binding)和動態加載(Dynamic loading)。

Objective-C具有相當多的動態特性,基本的,也是經常被提到和用到的有動態類型(Dynamic typing),動態綁定(Dynamic binding)和動態加載(Dynamic loading)。

這些動態特性都是在Cocoa程序開發時非常常用的語言特性,而在這之后,OC在底層也提供了相當豐富的運行時的特性,比如枚舉類屬性方法、獲取方法實現等等。雖然在平常的Cocoa開發中這些較底層的運行特性基本用不著,但是在某些情況下如果你知道這些特性并合理加以運用的話,往往能事半功倍~

動態特性基礎

1、動態類型

即運行時再決定對象的類型。這類動態特性在日常應用中非常常見,簡單說就是id類型。id類型即通用的對象類,任何對象都可以被id指針所指,而在實際使用中,往往使用introspection來確定該對象的實際所屬類:

  1. id obj = someInstance;   
  2. if ([obj isKindOfClass:someClass])   
  3.     someClass *classSpecifiedInstance = (someClass *)obj; 
  4.     // Do Something to classSpecifiedInstance which now is an instance of someClass 
  5.     //... 

-isMemberOfClass: 是 NSObject 的方法,用以確定某個 NSObject 對象是否是某個類的成員。與之相似的為 -isKindOfClass:,可以用以確定某個對象是否是某個類或其子類的成員。這兩個方法為典型的introspection方法。在確定對象為某類成員后,可以安全地進行強制轉換,繼續之后的工作。

2、動態綁定

基于動態類型,在某個實例對象被確定后,其類型便被確定了。該對象對應的屬性和響應的消息也被完全確定,這就是動態綁定。在繼續之前,需要明確Objective-C中消息的概念。由于OC的動態特性,在OC中其實很少提及“函數”的概念,傳統的函數一般在編譯時就已經把參數信息和函數實現打包到編譯后的源碼中了,而在OC中最常使用的是消息機制。調用一個實例的方法,所做的是向該實例的指針發送消息,實例在收到消息后,從自身的實現中尋找響應這條消息的方法。

動態綁定所做的,即是在實例所屬類確定后,將某些屬性和相應的方法綁定到實例上。這里所指的屬性和方法當然包括了原來沒有在類中實現的,而是在運行時才需要的新加入的實現。在Cocoa層,我們一般向一個NSObject對象發送-respondsToSelector:或者-instancesRespondToSelector:等來確定對象是否可以對某個SEL做出響應,而在OC消息轉發機制被觸發之前,對應的類的+resolveClassMethod:和+resolveInstanceMethod:將會被調用,在此時有機會動態地向類或者實例添加新的方法,也即類的實現是可以動態綁定的。一個例子:

  1. void dynamicMethodIMP(id self, SEL _cmd)   
  2.     // implementation .... 
  3.  
  4.  
  5.  
  6. //該方法在OC消息轉發生效前被調用 
  7. + (BOOL) resolveInstanceMethod:(SEL)aSEL 
  8. {  
  9.     if (aSEL == @selector(resolveThisMethodDynamically)) { 
  10.         //向[self class]中新加入返回為void的實現,SEL名字為aSEL,實現的具體內容為dynamicMethodIMP class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, “v@:”); 
  11.         return YES; 
  12.     } 
  13.     return [super resolveInstanceMethod:aSel]; 
  14. }   

當然也可以在任意需要的地方調用class_addMethod或者method_setImplementation(前者添加實現,后者替換實現),來完成動態綁定的需求。

3、動態加載

根據需求加載所需要的資源,這點很容易理解,對于iOS開發來說,基本就是根據不同的機型做適配。最經典的例子就是在Retina設備上加載@2x的圖片,而在老一些的普通屏設備上加載原圖。隨著Retina iPad的推出,和之后可能的Retina Mac的出現,這個特性相信會被越來越多地使用。

深入運行時特性

基本的動態特性在常規的Cocoa開發中非常常用,特別是動態類型和動態綁定。由于Cocoa程序大量地使用Protocol-Delegate的設計模式,因此絕大部分的delegate指針類型必須是id,以滿足運行時delegate的動態替換(在Java里這個設計模式被叫做Strategy?不是很懂Java,求糾正)。而Objective-C還有一些高級或者說更底層的運行時特性,在一般的Cocoa開發中較為少見,基本被運用與編寫OC和其他語言的接口上。但是如果有所了解并使用得當的話,在Cocoa開發中往往可以輕易解決一些棘手問題。

這類運行時特性大多由/usr/lib/libobjc.A.dylib這個動態庫提供,里面包括了對于類、實例成員、成員方法和消息發送的很多API,包括獲取類實例變量列表,替換類中的方法,為類成員添加變量,動態改變方法實現等,十分強大。完整的API列表和手冊可以在這里找到。雖然文檔開頭表明是對于Mac OS X Objective-C 2.0適用,但是由于這些是OC的底層方法,因此對于iOS開發來說也是完全相同的。

一個簡單的例子,比如在開發Universal應用或者游戲時,如果使用IB構建了大量的自定義的UI,那么在由iPhone版轉向iPad版的過程中所面臨的一個重要問題就是如何從不同的nib中加載界面。在iOS5之前,所有的UIViewController在使用默認的界面加載時(init或者initWithNibName:bundle:),都會走-loadNibNamed:owner:options:。而因為我們無法拿到-loadNibNamed:owner:options的實現,因此對其重載是比較困難而且存在風險的。因此在做iPad版本的nib時,一個簡單的辦法是將所有的nib的命名方式統一,然后使用自己實現的新的類似-loadNibNamed:owner:options的方法將原方法替換掉,同時保證非iPad的設備還走原來的loadNibNamed:owner:options方法。使用OC運行時特性可以較簡單地完成這一任務。

代碼如下,在程序運行時調用+swizze,交換自己實現的loadPadNibNamed:owner:options和系統的loadNibNamed:owner:options,之后所有的loadNibNamed:owner:options消息都將會發為loadPadNibNamed:owner:options,由自己的代碼進行處理。

  1. +(BOOL)swizze { 
  2.     Method oldMethod = class_getInstanceMethod(self, @selector(loadNibNamed:owner:options:)); 
  3.     if (!oldMethod) { 
  4.         return NO; 
  5.     } 
  6.     Method newMethod = class_getInstanceMethod(self, @selector(loadPadNibNamed:owner:options:)); 
  7.     if (!newMethod) { 
  8.         return NO; 
  9.     } 
  10.     method_exchangeImplementations(oldMethod, newMethod); 
  11.     return YES; 
  12. }   

loadPadNibNamed:owner:options的實現如下,注意在其中的loadPadNibNamed:owner:options由于之前已經進行了交換,因此實際會發送為系統的loadNibNamed:owner:options。以此完成了對不同資源的加載。

  1. -(NSArray *)loadPadNibNamed:(NSString *)name owner:(id)owner options:(NSDictionary *)options { 
  2.     NSString *newName = [name stringByReplacingOccurrencesOfString:@"@pad" withString:@""]; 
  3.     newName = [newName stringByAppendingFormat:@"@pad"]; 
  4.     //判斷是否存在 
  5.     NSFileManager *fm = [NSFileManager defaultManager]; 
  6.     NSString* filepath = [[NSBundle mainBundle] pathForResource:newName ofType:@”nib”]; 
  7.     //這里調用的loadPadNibNamed:owner:options:實際為為交換后的方法,即loadNibNamed:owner:options: 
  8.     if ([fm fileExistsAtPath:filepath]) { 
  9.         return [self loadPadNibNamed:newName owner:owner options:options]; 
  10.     } else { 
  11.         return [self loadPadNibNamed:name owner:owner options:options];  
  12.     } 
  13. }   

當然這只是一個簡單的例子,而且這個功能也可以通過別的方法來實現。比如添加UIViewController的類別來重載init,但是這樣的重載會比較危險,因為你UIViewController的實現你無法完全知道,因此可能會由于重載導致某些本來應有的init代碼沒有覆蓋,從而出現不可預測的錯誤。當然在上面這個例子中重載VC的init的話沒有什么問題(因為對于VC,init的方法會被自動轉發為loadNibNamed:owner:options,因此init方法并沒有做其他更復雜的事情,因此只要初始化VC時使用的都是init的話就沒有問題)。但是并不能保證這樣的重載對于其他類也是可行的。因此對于實現未知的系統方法,使用上面的運行時交換方法會是一個不錯的選擇~

 

責任編輯:張偉 來源: 王巍的博客
相關推薦

2014-08-05 13:09:34

Objective-C動態特性

2013-07-24 19:19:03

Objective-CiOS開發動態特性之protoc

2015-11-02 10:13:41

iOSObjective-C語法

2014-12-12 14:57:11

Objective-C封裝

2011-08-04 13:55:10

Cocoa Objective- 文件

2011-08-22 09:34:50

Objective-C多態動態類型

2011-08-10 18:07:29

Objective-C反射

2011-05-11 11:20:26

Objective-C

2013-06-20 10:40:32

Objective-C實現截圖

2011-05-11 15:58:34

Objective-C

2013-03-27 12:54:00

iOS開發Objective-C

2014-07-29 09:44:35

2013-04-11 13:41:30

Objective-CiOS編程

2011-05-11 13:54:08

Objective-C

2011-05-11 14:06:49

Objective-C

2011-08-04 11:15:46

Objective-C 構造函數 構造方法

2011-05-11 15:45:50

內存管理Objective-C

2013-08-21 14:57:42

objective-c問題

2011-08-02 13:16:36

Objective-C 語法 函數

2011-08-04 14:58:37

Objective-C Cocoa NSString
點贊
收藏

51CTO技術棧公眾號

youjizzjizz亚洲| avtt在线播放| 亚洲一区二区三区高清不卡| 亚洲欧美在线看| 天堂一区在线观看| 金瓶狂野欧美性猛交xxxx| 久久女同性恋中文字幕| 91精品久久久久久久久不口人| 欧洲第一无人区观看| 丝袜美腿综合| 日韩午夜电影av| 88av.com| yellow在线观看网址| 国产精品系列在线| 国产在线一区二区三区播放| 一级片在线免费观看视频| 亚洲国产午夜| 久久高清视频免费| 永久免费av无码网站性色av| 风间由美中文字幕在线看视频国产欧美| 欧美性xxxxx极品少妇| 免费看毛片的网址| 国产黄网站在线观看| 久久嫩草精品久久久久| 不卡一区二区三区视频| 亚洲中文字幕一区二区| 午夜一级久久| 久久久久久久久久久久久久久久久久av | 亚洲综合视频网站| 国产剧情在线观看一区| 精品国产成人在线影院| 黄色三级视频在线播放| a屁视频一区二区三区四区| 亚洲成人av免费| 三级在线免费观看| 日本福利专区在线观看| 久久精品人人做人人爽人人| 国产区一区二区| 国产浮力第一页| 国产综合久久久久久久久久久久| 国产999精品久久久影片官网| 国产在线观看99| 欧美日韩精品免费观看视频完整| 日韩视频精品在线| 女同久久另类69精品国产| 成人综合一区| 亚洲色图校园春色| 蜜桃无码一区二区三区| 最近国产精品视频| 亚洲美女精品久久| www.自拍偷拍| 久久99精品久久久久久园产越南| 国产丝袜一区二区三区| 成人免费av片| 国产伦精品一区二区三区千人斩| 亚洲欧美精品伊人久久| 久久久久久国产精品无码| 欧美热在线视频精品999| 亚洲女人初尝黑人巨大| a毛片毛片av永久免费| 亚洲人亚洲人色久| 亚洲色图50p| 成人在线观看免费高清| 欧美成人精品一区二区三区在线看| 中文欧美日本在线资源| 日本 欧美 国产| 亚洲综合五月| 欧美国产日韩中文字幕在线| 国产午夜福利片| 亚洲一区久久| 国产精品美女网站| 国产情侣激情自拍| 不卡在线视频中文字幕| 欧美精品123| www.在线播放| 一区二区三区四区中文字幕| 男人插女人视频在线观看| 英国三级经典在线观看| 欧美亚洲禁片免费| 欧美污在线观看| 鲁大师精品99久久久| 亚洲天堂免费在线| 内射一区二区三区| 国产欧美三级| 国产啪精品视频| 人妻无码中文字幕| 久久久久久久久久看片| 国产欧美综合一区| 91精品论坛| 欧美一级二级三级乱码| 中文字幕 亚洲一区| 日韩成人精品一区| 性欧美xxxx| 亚洲一区在线观| 99精品热视频| 国产在线拍揄自揄拍无码| 国产精品yjizz视频网| 欧美性xxxxxxxx| 香港三日本8a三级少妇三级99| jvid福利在线一区二区| 欧美另类极品videosbest最新版本 | 国产精品aaa| 亚洲国产www| 欧美国产日本视频| 欧美日韩黄色一级片| 99精品美女视频在线观看热舞| 亚洲国产欧美在线成人app | 成人av番号网| 日韩一区av| 亚洲一区二区三区四区在线 | 国产美女激情视频| 国产高清不卡二三区| 日本日本精品二区免费| 波多野结衣中文在线| 欧美日韩国产a| 欧美狂猛xxxxx乱大交3| 亚洲天堂激情| 亚洲最大成人网色| 1024国产在线| 色视频一区二区| 制服丝袜第一页在线观看| 久久久久国产| 91精品国产综合久久久久久蜜臀| 水莓100国产免费av在线播放| 一区二区三区自拍| 亚洲欧美日韩网站| 久久亚洲影视| 国产精品永久免费在线| 黄色小视频在线观看| 欧美日韩国产区| 欧美肉大捧一进一出免费视频| 牛夜精品久久久久久久99黑人| 国产精品久久久久91| 日漫免费在线观看网站| 懂色av一区二区三区| 精品影片一区二区入口| 狠狠爱成人网| 国产精品二区在线观看| 青青青草视频在线| 欧美一二三区在线观看| avove在线播放| 国产一区免费电影| www.-级毛片线天内射视视| av国产精品| 超碰91人人草人人干| 中文字幕一区二区三区四区视频 | 精品国产一区av| 在线观看国产一区二区三区| 中文字幕欧美国产| 日韩在线不卡一区| 国产精品88久久久久久| 91精品久久久久久久久久久久久久| youjizz在线播放| 精品视频999| 国产黄色片在线| 黄一区二区三区| 国产女人18毛片| 超碰一区二区三区| 日本成熟性欧美| 成年人视频网站在线| 欧美三级电影精品| 特一级黄色录像| 成人免费看视频| 免费av网址在线| 成人羞羞动漫| 亚洲专区中文字幕| 丁香高清在线观看完整电影视频 | 欧美日韩国产天堂| 日韩女优一区二区| av高清不卡在线| 久久人妻精品白浆国产| 欧美高清视频手机在在线| 成人免费直播live| √8天堂资源地址中文在线| 亚洲女人天堂网| 91av久久久| 一级中文字幕一区二区| 日本xxx在线播放| 久久99国产精品免费| 女人帮男人橹视频播放| 九色精品国产蝌蚪| 亚洲最大成人在线| 精品国产第一福利网站| 久久久久北条麻妃免费看| 日韩一区二区三区在线观看视频 | 美女网站免费观看视频| 亚洲二区三区不卡| 久草精品电影| 青青在线精品| 91av在线免费观看视频| 秋霞午夜在线观看| 日韩av一区二区在线| 亚洲天堂777| 五月综合激情婷婷六月色窝| 四虎永久免费地址| 99国产一区二区三精品乱码| 一本一道久久a久久综合蜜桃| 激情自拍一区| 中文字幕一区二区中文字幕| 久久久久观看| 91免费的视频在线播放| 国产伦精品一区二区三区视频金莲| 久久久久www| 成人一区二区不卡免费| 精品国产精品一区二区夜夜嗨| 中文字字幕在线观看| 精品久久久久久亚洲国产300| 影音先锋男人资源在线观看| 91美女精品福利| 中文字幕永久免费| 美国欧美日韩国产在线播放| 成人免费观看视频在线观看| 午夜性色一区二区三区免费视频| 五月天色一区| 亚洲区小说区| 精品国产一区二区三区日日嗨| 国产色99精品9i| 国产精品中文字幕久久久| 乡村艳史在线观看| 久久久久久网址| av大大超碰在线| zzjj国产精品一区二区| a天堂中文在线88| 亚洲少妇中文在线| 婷婷视频在线观看| 精品国产91洋老外米糕| 国产suv一区二区| 欧美精品xxxxbbbb| 亚洲一区二区三区网站| 欧美影院午夜播放| 免费又黄又爽又猛大片午夜| 欧美日韩在线视频观看| 日产电影一区二区三区| 亚洲一区二区三区在线播放| 成年人一级黄色片| 亚洲精品国产一区二区精华液| 蜜桃av.com| 亚洲日本一区二区| 国产白丝一区二区三区| 亚洲欧洲日本在线| 成年人视频软件| 国产精品欧美久久久久一区二区| 中文字幕 自拍| 国产午夜精品美女毛片视频| 日韩av在线看免费观看| 久久精品免费在线观看| 蜜桃av免费看| 中文久久乱码一区二区| 免费观看特级毛片| 亚洲日穴在线视频| 五月天丁香激情| 亚洲va在线va天堂| 国产综合精品视频| 91国产丝袜在线播放| 国产一区免费看| 欧美精品精品一区| www.国产.com| 日韩成人在线免费观看| 免费国产在线观看| 中文字幕在线亚洲| 黄色片网站在线| 欧美极品美女视频网站在线观看免费 | 久久久久国产免费免费| 日本欧美一区二区三区不卡视频| 国产精品色眯眯| 人妻少妇精品一区二区三区| 亚洲福利视频导航| 国产成人a v| 91精品国产一区二区三区香蕉| 亚洲产国偷v产偷v自拍涩爱| 亚洲激情在线观看视频免费| 国产天堂在线| 欧美久久久精品| 在线免费看h| 国产在线观看不卡| 国产精品videossex| 日本精品视频一区| 欧美区亚洲区| 凹凸日日摸日日碰夜夜爽1| 狠狠色综合播放一区二区| 91精品又粗又猛又爽| 久久亚洲欧美国产精品乐播| 三级黄色在线观看| 大荫蒂欧美视频另类xxxx| 国产精品成人久久久| 日韩美女视频在线| 欧美3p视频在线观看| 久久亚洲一区二区三区四区五区高| 成全电影大全在线观看| 国产精品视频午夜| 精品在线网站观看| 中文字幕一区二区三区四区五区 | 51精品在线观看| 欧美激情不卡| 精品一区二区三区日本| 香蕉综合视频| 男人亚洲天堂网| 国产成人av电影在线观看| 熟女俱乐部一区二区| 亚洲午夜精品17c| 在线观看日韩一区二区| 亚洲精品999| 日韩123区| 国产欧美最新羞羞视频在线观看| 美女av一区| 五月天激情图片| 青青青爽久久午夜综合久久午夜| 91超薄肉色丝袜交足高跟凉鞋| 国产精品美女视频| 一本一道无码中文字幕精品热| 欧美一区二区成人6969| 69久久精品| 青青草成人在线| 1313精品午夜理伦电影| 日韩视频在线观看视频| 日日夜夜免费精品视频| 日韩 中文字幕| 亚洲国产精品久久艾草纯爱| 国产熟女一区二区丰满| 日韩中文字幕av| 快播电影网址老女人久久| 国产精华一区| 欧美日韩国产成人精品| 午夜av中文字幕| 国产精品久久久久久福利一牛影视 | 911精品国产一区二区在线| 福利视频在线看| 奇米成人av国产一区二区三区| 久久久久观看| 国产成人无码a区在线观看视频| 国产成人精品三级麻豆| 99久久久免费精品| 欧美二区在线观看| 欧美三级黄网| 91精品久久久久| 午夜精品毛片| 亚欧精品在线视频| 亚洲日本在线观看| 国产黄a三级三级三级| 久久成人在线视频| 清纯唯美激情亚洲| 日本在线视频www色| 国产在线精品免费| 九九视频免费看| 欧美成人一区二区三区片免费| 综合久久2o19| 福利视频久久| 亚洲日本久久| 一本色道久久综合亚洲精品图片| 婷婷开心激情综合| 青青草超碰在线| 国产精品成人在线| 三级电影一区| 伊人色在线视频| 亚洲精品亚洲人成人网| 免费观看黄一级视频| 欧美在线欧美在线| 精品一级毛片| 久久久久久久久久毛片| 亚洲影视资源网| 天堂a√中文在线| 国产精品久久视频| 天天久久综合| 亚洲高清无码久久| 色综合视频在线观看| 丁香婷婷在线观看| 91成人伦理在线电影| 亚洲欧洲午夜| www久久久久久久| 91精品久久久久久蜜臀| wwww亚洲| 视频一区在线免费观看| 国产精品一区二区免费不卡| 日韩精品久久久久久久| 亚洲丝袜av一区| www.成人| 人妻精品无码一区二区三区| 中文字幕不卡在线观看| 亚洲第一精品网站| 国产99在线|中文| 中文在线日韩| 色婷婷av777| 欧美一区二区三区在线看| freexxx性亚洲精品| 天天综合狠狠精品| 懂色av一区二区夜夜嗨| 91青青草视频| 九九视频这里只有精品| 精品国产91乱码一区二区三区四区| 女王人厕视频2ⅴk| 日韩欧美在线免费| 菠萝菠萝蜜在线视频免费观看 | 完全免费av在线播放| 极品少妇xxxx偷拍精品少妇| 亚洲欧美在线视频免费| 日韩中文字幕网站| 最近国产精品视频| 日本一区二区免费视频| 欧美日本高清视频在线观看| 久久影院午夜精品|