偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Objective-C KVO簡(jiǎn)單探索

移動(dòng)開發(fā) iOS
KVO(Key Value Observing),是觀察者模式在Foundation中的實(shí)現(xiàn)。當(dāng)一個(gè)object有觀察者時(shí),動(dòng)態(tài)創(chuàng)建這個(gè)object的類的子類,對(duì)于每個(gè)被觀察的property,重寫其set方法;當(dāng)一個(gè)property沒有觀察者時(shí),刪除重寫的方法,當(dāng)沒有observer觀察任何一個(gè)property時(shí),刪除動(dòng)態(tài)創(chuàng)建的子類。

KVO(Key Value Observing),是觀察者模式在Foundation中的實(shí)現(xiàn)。

KVO的原理

簡(jiǎn)而言之就是:

1、當(dāng)一個(gè)object有觀察者時(shí),動(dòng)態(tài)創(chuàng)建這個(gè)object的類的子類

2、對(duì)于每個(gè)被觀察的property,重寫其set方法

3、在重寫的set方法中調(diào)用- willChangeValueForKey:和- didChangeValueForKey:通知觀察者

4、當(dāng)一個(gè)property沒有觀察者時(shí),刪除重寫的方法

5、當(dāng)沒有observer觀察任何一個(gè)property時(shí),刪除動(dòng)態(tài)創(chuàng)建的子類

空說無(wú)憑,簡(jiǎn)單驗(yàn)證下。

  1. @interface Sark : NSObject  
  2. @property (nonatomic, copy) NSString *name;  
  3. @end  
  4.   
  5. @implementation Sark  
  6. @end 
  1. Sark *sark = [Sark new];  
  2. // breakpoint 1  
  3. [sark addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:nil];  
  4. // breakpoint 2  
  5. sark.name = @"薩薩薩";  
  6. [sark removeObserver:self forKeyPath:@"name"];  
  7. // breakpoint 3  

斷住后分別使用- class和object_getClass()打出sark對(duì)象的Class和真實(shí)的Class

  1. // breakpoint 1  
  2. (lldb) po sark.class  
  3. Sark  
  4. (lldb) po object_getClass(sark)  
  5. Sark  
  6.   
  7. // breakpoint 2  
  8. (lldb) po sark.class  
  9. Sark  
  10. (lldb) po object_getClass(sark)  
  11. NSKVONotifying_Sark  
  12.   
  13. // breakpoint 3  
  14. (lldb) po sark.class  
  15. Sark  
  16. (lldb) po object_getClass(sark)  
  17. Sark  

上面的結(jié)果說明,在sark對(duì)象被觀察時(shí),framework使用runtime動(dòng)態(tài)創(chuàng)建了一個(gè)Sark類的子類 NSKVONotifying_Sark,而且為了隱藏這個(gè)行為,NSKVONotifying_Sark重寫了- class方法返回之前的類,就好像什么也沒發(fā)生過一樣。但是使用object_getClass()時(shí)就暴露了,因?yàn)檫@個(gè)方法返回的是這個(gè)對(duì)象的isa 指針,這個(gè)指針指向的一定是個(gè)這個(gè)對(duì)象的類對(duì)象

然后來偷窺一下這個(gè)動(dòng)態(tài)類實(shí)現(xiàn)的方法,這里請(qǐng)出一個(gè)NSObject的擴(kuò)展NSObject+DLIntrospection,它封裝了打印一個(gè)類的方法、屬性、協(xié)議等常用調(diào)試方法,一目了然。

  1. @interface NSObject (DLIntrospection)  
  2. + (NSArray *)classes;  
  3. + (NSArray *)properties;  
  4. + (NSArray *)instanceVariables;  
  5. + (NSArray *)classMethods;  
  6. + (NSArray *)instanceMethods;  
  7.   
  8. + (NSArray *)protocols;  
  9. + (NSDictionary *)descriptionForProtocol:(Protocol *)proto;  
  10.   
  11. + (NSString *)parentClassHierarchy;  
  12. @end  

然后繼續(xù)在剛才的斷點(diǎn)處調(diào)試:

  1. // breakpoint 1  
  2. (lldb) po [object_getClass(sark) instanceMethods]  
  3. <__NSArrayI 0x8e9aa00>(  
  4. - (void)setName:(id)arg0 ,  
  5. - (void).cxx_destruct,  
  6. - (id)name  
  7. )  
  8. // breakpoint 2  
  9. (lldb) po [object_getClass(sark) instanceMethods]  
  10. <__NSArrayI 0x8d55870>(  
  11. - (void)setName:(id)arg0 ,  
  12. - (class)class,  
  13. - (void)dealloc,  
  14. - (BOOL)_isKVOA  
  15. )  
  16. // breakpoint 3  
  17. (lldb) po [object_getClass(sark) instanceMethods]  
  18. <__NSArrayI 0x8e9cff0>(  
  19. - (void)setName:(id)arg0 ,  
  20. - (void).cxx_destruct,  
  21. - (id)name  
  22. )  

首先就有個(gè)扎眼的- .cxx_destruct冒出來,這貨是個(gè)啥?詳細(xì)的探究請(qǐng)參考我的另一篇文章。

大概就是說arc下這個(gè)方法在所有dealloc調(diào)用完成后負(fù)責(zé)釋放所有的變量,當(dāng)然這個(gè)和KVO沒啥關(guān)系了,回到正題。

從上面breakpoint2的打印可以看出,動(dòng)態(tài)類重寫了4個(gè)方法:

1、- setName:最主要的重寫方法,set值時(shí)調(diào)用通知函數(shù)

2、- class隱藏自己必備啊,返回原來類的class

3、- dealloc做清理犯罪現(xiàn)場(chǎng)工作

4、- _isKVOA這就是內(nèi)部使用的標(biāo)示了,判斷這個(gè)類有沒被KVO動(dòng)態(tài)生成子類

接下來驗(yàn)證一下KVO重寫set方法后是否調(diào)用了- willChangeValueForKey:和- didChangeValueForKey:

最直接的驗(yàn)證方法就是在Sark類中重寫這兩個(gè)方法:

  1. @implementation Sark  
  2.   
  3. - (void)willChangeValueForKey:(NSString *)key  
  4. {  
  5.     NSLog(@"%@", NSStringFromSelector(_cmd));  
  6.     [super willChangeValueForKey:key];  
  7. }  
  8.   
  9. - (void)didChangeValueForKey:(NSString *)key  
  10. {  
  11.     NSLog(@"%@", NSStringFromSelector(_cmd));  
  12.     [super didChangeValueForKey:key];  
  13. }  
  14.   
  15. @end  

 

責(zé)任編輯:閆佳明 來源: blog.sunnyxx
相關(guān)推薦

2011-07-19 17:24:31

Objective-C 對(duì)象

2011-07-27 16:55:12

Objective-c 閉包

2011-08-10 18:07:29

Objective-C反射

2011-05-11 15:58:34

Objective-C

2013-03-27 12:54:00

iOS開發(fā)Objective-C

2013-06-20 10:40:32

Objective-C實(shí)現(xiàn)截圖

2011-05-11 11:20:26

Objective-C

2013-08-21 13:26:43

Objective-CNSDate說明

2011-08-02 13:16:36

Objective-C 語(yǔ)法 函數(shù)

2011-05-11 14:06:49

Objective-C

2013-08-21 14:57:42

objective-c問題

2011-05-11 15:45:50

內(nèi)存管理Objective-C

2011-08-04 14:58:37

Objective-C Cocoa NSString

2011-08-04 11:15:46

Objective-C 構(gòu)造函數(shù) 構(gòu)造方法

2011-05-11 13:54:08

Objective-C

2011-08-03 16:55:05

Objective-C 代理

2011-07-08 13:49:46

Objective-C UUID

2011-08-17 10:58:59

Objective-C構(gòu)造函數(shù)

2012-06-15 09:47:48

Objective-CCategory

2014-04-30 10:16:04

Objective-CiOS語(yǔ)法
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)