四、擴展
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就會出錯,所以要判斷。其次這樣也可以防止對屬性賦值同一個對象。