1. 分類-category
-
如何使用編程
- 聲明私有方法
- 分解體積龐大的類文件
- 把Framework的私有方法公開等
-
分類的特色(與擴展的區別)設計模式
- 運行時決議
- 能夠爲系統類添加分類
- 可聲明,可實現
-
分類能夠添加什麼安全
- 實例方法
- 類方法
- 協議
- 屬性(只生成get、set方法,不生成實例變量),可添加關聯對象
- 分類添加的方法能夠「覆蓋」原類的方法
- 同名分類方法最後被編譯的分類最優先生效
- 命名相同的分類會引發編譯錯誤
-
分類成員結構 bash
-
分類的加載調用棧 ui
2. 關聯對象
id objc_getAssociatedObject(id object, const void *key)
void objc_setAssociatedObject(id object, const void *key, id value, object_AssociationPolicy policy)
void objc_removeAssociatedObject(id object)
複製代碼
關聯對象由AssociationsManger管理並在AssociationsHashMap存儲。全部對象的關聯內容都在同一個全局容器中。編碼
3. 擴展-Extension
-
使用atom
- 聲明私有屬性
- 聲明私有方法
- 聲明私有成員變量
- 編譯時決議
- 只以聲明的形式存在,多數狀況下寄生於宿主類的.m中
- 不能爲系統類添加擴展
4. 代理-Delegate
-
是一種軟件設計模式spa
- iOS中以@protocol的形式體現
- 傳遞方式一對一
5. 通知-NSNotification
- 設計模式 —— 觀察者模式
- 使用觀察者模式來實現的用於跨層傳遞消息的機制
- 傳遞方式一對多
-
實現機制線程
6. KVO
-
觀察者模式設計
- 是Key-value observing的縮寫
- 是OC對觀察者模式的又一實現
- 使用了isa混寫(isa-swizzling)來實現
- 使用setter方法改變值KVO纔會生效
- 使用setVaule:forKey:改變值KVO纔會生效
- 成員變量直接修改不會生效,可手動觸發
7. KVC
-
Key-value coding的縮寫
- Apple 提供的鍵值編碼技術
-
- (id)valueForKey:(NSString *)key
-
- (id)setValue:(id)value forKey:(NSString *)key
- 破壞了面向對象編程思想
訪問順序
- _key
- _isKey
- key
- isKey
8. 屬性關鍵字
- 讀寫權限
- 原子性
- atomic(默認,保證賦值和獲取是線程安全的,如操做並非線程安全的)
- nonatomic
- 引用計數
- retain/strong
- assign/unsafe_unretained
- assign
- 既可修飾基本數據類型,又可修飾對象
- 修飾基本數據類型,如int、 BOOL
- 修飾對象類型時,不改變其引用計數
- 會產生懸垂指針
- weak
- 只能修飾對象
- 不改變被修飾對象的引用計數
- 所指對象在被釋放後會自動置爲nil
- copy
9. MRC下重寫retain修飾變量的setter方法
@property (nonatomic, retain) id obj:
- (void)setObj:(id)obj {
if (_obj != obj) { // 防止傳入同一個變量被釋放,後面訪問出錯
[_obj release];
_obj = [obj retain];
}
}
複製代碼