|
首先先說一個簡書作者的博客,把runtime入門講得夠清晰。 http://www.jianshu.com/p/25a319aee33d Objective-C語言使用了面向?qū)ο筇匦院拖⑥D(zhuǎn)發(fā)機制。 一:Runtime的數(shù)據(jù)結(jié)構(gòu):
解析:Root class其實就是NSObject,NSObject是沒有超類的,所以Root class 的superclass指向nil; 每一個Class都有一個isa指針指向唯一的Meta class; Root class(meta)的superclass指向Root class,也就是NSObject,形成一個回路; 每個Meta class的isa指針都指向Root class(Meta); 注意: 不論是示例對象還是Class,都是id類型的對象(Class同樣是對象) 示例對象的isa指向它的Class(儲存所有減法方法),Class對象isa指向元類(儲存所有加好方法) 向一個對象(id)類型發(fā)送消息時,都是從這個對象的isa指針指向的Class中尋找方法 methodLists表示方法列表,他是指向objc_method_list結(jié)構(gòu)體的二級指針,可以動態(tài)修改*methodLists的值來添加成員方法,也是category實現(xiàn)原理,同樣也解析category不能添加示例變量的原因。 (二級指針相關(guān)閱讀:http://www./blog/2014/07/03/pointers-to-pointers.html) @implementation Son : Father- (id)init{ self = [super init]; if (self) { NSLog(@'%@', NSStringFromClass([self class])); NSLog(@'%@', NSStringFromClass([super class])); } return self;}@end 兩個都是輸出son,具體看文章解析。 二:關(guān)于消息轉(zhuǎn)發(fā)機制:
關(guān)于這個的一些比較基礎(chǔ)的用法可以在另外一個例子直接看到: http://my.oschina.net/caijunrong/blog/508738 這三種方法的選擇時機作者說: Method Resolution:由于Method Resolution不恩能夠像消息轉(zhuǎn)發(fā)那樣可以交給其他對象來處理,所以只能適用在 原來的類中替代掉; Fast Forwarding:它可以將消息處理轉(zhuǎn)發(fā)給其它對象,使用范圍更廣,不只是限于原來的對象; Normal Forwarding: 它跟Fast Forwarding一樣可以消息轉(zhuǎn)發(fā),單它能通過NSInvocation對象獲取更多消息發(fā)送的信息,例如:target、selector、arguments和返回值等信息。 三:關(guān)于怎么使用Category對已存在的類別進行擴展,一般只能添加示例方法貨類方法,因為二級指針的原因,而不適合添加額外的屬性。雖然可以在category頭文件中聲明property屬性,但在實現(xiàn)文件中編譯器是無法synthesize任何示例變量和屬性訪問方法。這時需要自定義屬性訪問方法,并且使用Associatd Objects來給已經(jīng)存在的類Category添加自定義的屬性。 Associated Objects提供三個API來向?qū)ο筇砑?、獲取和刪除關(guān)聯(lián)值: void objc_setAssociatedObject (id object, const void *key, id value, objc_AssociationPolicy policy ) id objc_getAssociatedObject (id object, const void *key ) void objc_removeAssociatedObjects (id object ) 筆試題: iOS6級: http://blog./2014/03/06/ios_exam_0_key/ |
|
|
來自: shijingfulwpqz > 《文件夾1》