一、分類(category)
1、在開發過程中分類都可以做哪些事情?
a、聲明私有方法。
b、分解體積龐大的類文件。
c、把Framework的私有方法公開化。
2、分類的特點:
a、在運行時決議(在運行時候通過runloop添加到相應的數組類中,這是它最大的特點,這是分類和擴展最大區別)
b、可以為系統類添加分類。
3、分類中可以添加哪些內容
a、可以添加實例方法
b、類方法
c、協議
d、屬性(在分類中添加屬性只是申明了get/set方法并沒有為分類添加實例變量)
分類可以通過關聯對象添加實例變量。
二、關聯對象
1、 能否給分類添加“成員變量”?
能,可以通過關聯對象技術來實現分類關聯對象。
2、關聯對象的方法
3、怎樣清楚某一個關聯對象的關聯值?
setObjectValue傳值為nil
三、擴展
1、一般用擴展來做什么?
a、聲明私有屬性
b、聲明私有方法
c、聲明私有成員變量
2、分類、擴展的區別?
擴展的特點:a、編譯時決議
b、只以聲明的形式存在,多數情況下寄生于宿主類的.m
c、不能為系統添加擴展
分類的特點:
a、在運行時決議(在運行時候通過runloop添加到相應的數組類中,這是它最大的特點,這是分類和擴展最大區別)
b、可以為系統類添加分類。
c、分類有聲明和實現.
四、代理
1、什么是代理
a、它是一種軟件設計模式(代理模式)
b、iOS當中以@protocol形式體現
c、它的傳遞方式是一對一的。(這是代理跟通知的最大區別,通知是一對多傳遞方式)
2、代理的工作流程
3、代理協議可以定義哪些內容?
a、可以定義代理方法
b、可以定義成員屬性
4、代理協議里面聲明的方法或屬性代理方必須都要實現嗎?
不一定,要看具體情況。例如:對于協議中申明是@optional就不是必需要,但對于@required必須要實現
5、代理方、委托方以什么方式存在?
一般在委托方聲明為weak以規避循環引用。
五、通知(NSNotification)
1、通知的特點:
a、是使用觀察者模式來實現的用于跨層傳遞消息機制。
b、傳遞方式為一對多。
2、代理和通知區別
a、代理是用代理模式實現的,通知是用觀察者模式實現
b、代理傳遞方式是一對一,通知是一對多。
3、如何實現通知機制?
在通知中心有一個Map表它key是notifactionName 它的Value是 Observers_list,在Observers_list數據中每一個成員應該首先包括通知接受的觀察者,其次包含這個觀察者調用的方法,以及收到通知之后觀察者的回調方法。
六、KVO
1、什么是kvo
a、 kvo是key-value observing的縮寫,它是OC對觀察者模式的又一實現。
b、APPle使用了isa混寫(isa-swizzling)來實現kvo
isa混寫技術在kvo中是怎樣實現的?
當我們注冊一個觀察者A時候,實際上是調用了系統oberserver: forKeyPath:時,系統會為我們在運行時動態將A這個類的isa指針地址指向NSKVONotfying_A。同時重寫setter方法
系統在運行時候動態為我們創建了一個子類,改寫isa指向同時重寫setter方法。來實現kvo的機制
2、通過kvc設置value,kvo是否生效?
能生效。
為什么能生效?kvc調用setValue:forkey:調用最終會調用到kvo的setter方法
3、通過成員變量直接賦值,kvo是否生效?
不能生效。但是可以通過手動設置kvo,在直接賦值之前調用willChangeValueforKey:,在賦值之后調用didChangeValueforKey:;kvo就能生效
六、KVC
1、什么是kvc
是蘋果系統為我們提供一種鍵值編碼技術
-(id)valueForKey:(NSString*)key 通過這個方法可以獲取跟key同名或者相似名稱的實例變量的值
-(id)setValue:(id)value forKey:(NSString*)key 通過這個方法可以設置某一對象中和這個key同名或者相似名稱實例變量的值
2、通過kvc(鍵值編碼技術)是否違背了面向對象思想?
七、屬性關鍵字
1、屬性關鍵可以分類哪幾類?
a、讀寫權限: readolny readwrite
b、原子性:atomic(它可以保證屬性賦值、獲取是線程安全的)、nonatomic
c、引用計數:retain/strong,assign/unsafe_unretained 、weak、copy
2、assin
a、修飾基本數據類型,比如:int、Bool等
b、修飾對象時,不改變其引用計數。
c、會產生懸垂指針。(它所修飾對象在被釋放之后 仍指向原來地址不沒有立即設置為nil,當再次用它修飾時候會造成內存泄露)
3、weak
a、不改變被修飾對象引用計數。
b、它所指對象在被釋放之后會自動置nil.
4、copy
a、淺拷貝
淺拷貝只是對內存地址的復制,讓目標對象指針跟原對象指針指向同一個內存地址。它會增加被對象的引用計數
b、深拷貝
目標對象指針和原對象指針指向兩片內容相同的內存地址空間。
它不會增加被拷貝的引用計數,產生了內存分配。
@property(copy)NSMutableArray* array?
聲明這樣一個屬性會導致程序一些不可以預測性
1、如果賦值過來的是NSmutableArray,通過copy之后就是NSArray
2、如果賦值過來的是NSArray,通過copy之后就是NSArray
由于原來這個這個屬性聲明是可變對象,但是拷貝過來對象是不可變對象,
?