第4章:Objective-C語言相關技術特性——四、擴展;五、代理;六、通知;七、KVO;八、KVC;九、屬性關鍵字

四、擴展

      1、一般用擴展做什麼?

1)、聲明私有屬性

2)、聲明私有方法

3)、聲明私有成員變量

      2、擴展的特點(與類別的區別)

1)、編譯時決議

2)、只以聲明的形式存在,多數情況下寄生於宿主類的.m文件中

3)、不能爲系統類添加擴展

 

五、代理

      一般針對初級工程師考察代理,對中級及以上工程師考察的比較少。

      1、代理的理解

1)、準確的說是一種軟件設計模式

2)、iOS中以@protocol形式體現

3)、傳遞方式一對一(與通知的區別)

      2、代理的工作流程

 

六、通知

      1、通知的理解

1)、通知是使用觀察者模式來實現的用於跨層傳遞消息的機制

2)、傳遞方式爲一對多

      2、通知和代理的區別

1)、通知是觀察者模式實現的,代理是代理模式實現的

2)、通知傳遞方式一對多,代理是一對一

3)、如何實現通知

NS開頭的系統類蘋果沒有公佈源碼,根據觀察者模式大致說一下實現過程就好。

 

七、KVO

      1、什麼是KVO

1)、KVO是Objective-C對觀察者模式的又一實現

2)、Apple使用了isa混寫(isa-swizzling)來實現KVO

      2、KVO的實現機制是怎樣的

      3、KVO對setter方法的實現

      4、通過KVC設置屬性值能否使KVO生效?爲什麼?

能。這需要了解KVC的原理,因爲KVC過程中調用了屬性的setter方法。

      5、通過成員變量直接賦值能否使KVO生效?

不能。此時可以在成員變量賦值語句的前後手動調用willChangeValueForKey和didChangeValueForKey方法來使KVO生效。

 

八、KVC

      1、什麼是KVC

是鍵值編碼技術,通過key設置/獲取對象中同名的屬性的值。主要有兩個函數:

-(id)valueForKey:(NSString *)key

-(void)setValue:(id)value forKey:(NSString *)key

      2、KVC是否破壞面向對象編程思想

破壞。因爲一個私有屬性通過KVC也能獲取/設置其值。

      3、valueForKey的系統實現

Accessor Method方法用來判斷類中是否有相應的訪問器,如果類中實現了getKey、key、isKey方法則系統認爲類中存在相應的訪問器方法,則調用訪問器方法實現相關操作。

如果訪問器方法不存在則判斷同名/相似名稱的實例變量是否存在,如果存在則操作相應的實例變量。實例變量的判斷規則:存在_key、_isKey、key、isKey實例變量則認爲存在同名/相似名稱的實例變量。

      4、setValue:forKey:的系統實現流程

 

九、屬性關鍵字

      1、屬性關鍵字分爲幾類

1)、讀寫權限:readonly、readwrite(默認)

2)、原子性:atomic(默認)、nonatomic

3)、引用計數:retain/strong、assign/unsafe_unretained、weak、copy

unsafe_unretained在MRC中用的比較多,在ARC中基本上已經退出舞臺了。

      2、atomic能保證線程安全嗎

只能保證對所修飾對象的設置和獲取是安全的,其他的不保證。比如修飾數組時,對數組的賦值是安全的,但是向數組中添加元素和刪除元素則不保證安全。

      3、assign的特點

1)、修飾基本數據類型,如int、BOOL等

2)、修飾對象類型時,不改變其引用計數

3)、會產生野指針

      4、weak的特點

1)、不改變被修飾對象的引用計數

2)、所指對象在被釋放之後會自動置爲nil

      5、assign和weak的區別是什麼?

1)、weak修飾對象,assign既可以修飾基本類型,也可以修飾對象,但一般不修飾對象。

2)、weak修飾對象被釋放後置爲nil,assign修飾的對象釋放之後仍指向原地址

      6、淺拷貝、深拷貝,及兩者區別

1)、淺拷貝就是對內存地址的複製,讓目標對象指針和源對象指向同一片內存空間。

2)、深拷貝讓目標對象指針和源對象指針指向兩片內容相同的內存空間。

3)、區別:是否開闢了新的內存空間、是否影響了引用計數。

      7、可變對象和不可變對象copy操作的區別

      8、MRC下如何重寫retain修飾的setter方法?

爲什麼要判斷新老對象是否相等呢?主要是因爲如果兩者是同一對象,則release之後對象就可能被內存回收了,再retain就會出錯,所以要判斷。其次這樣也可以防止對屬性賦值同一個對象。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章