Category(分類)
- 聲明私有方法
- 分解體積龐大的類文件
- 把Framework的私有方法公開
特點
- 運行時決議
- 可以為系統(tǒng)類添加分類
可添加那些內(nèi)容
- 實例方法
- 類方法
- 協(xié)議
- 屬性(只生成setter和getter的聲明保礼,不會生成setter和getter的實現(xiàn)以及成員變量)
- 可通過關(guān)聯(lián)對象添加成員變量
struct objc_category {
char * _Nonnull category_name OBJC2_UNAVAILABLE; //分類名
char * _Nonnull class_name OBJC2_UNAVAILABLE; //類名
struct objc_method_list * _Nullable instance_methods OBJC2_UNAVAILABLE; //實例方法
struct objc_method_list * _Nullable class_methods OBJC2_UNAVAILABLE; //類名
struct objc_protocol_list * _Nullable protocols OBJC2_UNAVAILABLE; //協(xié)議
}
關(guān)聯(lián)對象
//關(guān)聯(lián)對象 object:被關(guān)聯(lián)的對象; key:關(guān)聯(lián)的key责语,要求唯一炮障; value:關(guān)聯(lián)的對象
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
//獲取關(guān)聯(lián)的對象
id objc_getAssociatedObject(id object, const void *key)
//移除關(guān)聯(lián)的對象
void objc_removeAssociatedObjects(id object)
Extension(擴展)
一般用擴展做什么
- 聲明私有屬性
- 聲明私有方法
- 聲明私有成員變量
特點
- 編譯時決議
- 只以聲明的形式存在,多數(shù)情況下寄生于宿主類的.m中
- 不能為系統(tǒng)類添加擴展
通知
- 是使用觀察者模式來實現(xiàn)的用于跨層傳遞消息的機制
- 傳遞方式為一對多
代理
- 一對一
KVO
- KVO是OC對觀察者設(shè)計模式的又一實現(xiàn)
- Apple使用了isa混寫(isa-swizzling)來實現(xiàn)KVO
- 使用setter方法改變值kvo才會生效
- 使用setValue:forKey:改變值kvo會生效
- 成員變量直接修改需手動添加kvo(willChangeValueForKey 和 didChangeValueForKey)才會生效
屬性關(guān)鍵字
- 讀寫權(quán)限
readonly
readwrite - 原子性
atomic:線程安全
nonatomic - 引用計數(shù)
return/strong
assign/unsafe_unretained
assign和week有什么區(qū)別
- assign
修飾基本數(shù)據(jù)類型坤候,如int胁赢,bool等
修飾對象類型,不改變引用計數(shù)
會產(chǎn)出懸垂指針白筹。 - weak
不改變被修飾對象的引用計數(shù)
所指對象在被釋放之后會自動置為nil
copy
- 可變對象的copy和mutableCopy都是深拷貝
- 不可變對象的copy是淺拷貝 mutableCopy都是深拷貝
- copy方法返回的都是不可變對象