注:本文集為自己準(zhǔn)備面試時(shí)榴芳,系統(tǒng)復(fù)習(xí)的筆記嗡靡,如大家有興趣,歡迎閱讀并指正
分類
1窟感、什么是分類?
1.聲明私有方法和使用歉井,對(duì)外不暴露
2.分解體積龐大的類文件
3.把Framework的私有方法公開化
2柿祈、分類的特點(diǎn)?分類和擴(kuò)展的區(qū)別哩至?
1.運(yùn)行時(shí)進(jìn)行決議躏嚎。通過RunTime運(yùn)行時(shí)添加到類上
2.可以為系統(tǒng)類添加分類。給NSObject添加擴(kuò)展
3菩貌、分類都可以添加哪些內(nèi)容卢佣?
1.分類可以添加實(shí)例方法,類方法箭阶,協(xié)議虚茶,屬性。
2.添加屬性只聲明了setter方法和getter方法仇参,并未有對(duì)其賦實(shí)例變量賦值嘹叫。
3.如果要實(shí)例變量,要通過關(guān)聯(lián)完成诈乒。
4罩扇、加載調(diào)用棧
程序加載順序如下:
_objc_init -> map_2_images -> map_images_nolock -> _read_iamges -> remethodizeClass
分類在remethodizeClass完成。
5怕磨、最后編譯的分類方法生效浆洗,倒序遍歷,最先訪問最后編譯的分類孩锡。分類是在運(yùn)行時(shí)決定榜轿,attachLists(mlists,mcount)該方法決定。
/// addedLists 為二維數(shù)組滩届,可以代表分類A集侯、分類B被啼、分類C的方法列表
void attachLists(List *const * addedLists,uint32_t addedCount) {
分類方法會(huì)“覆蓋”宿主類的方法原因
}
- 分類添加的方法可以“覆蓋”原類方法,原類該方法依然存在
- 同名分類方法誰能生效取決于編譯順序
- 名字相同的分類會(huì)引起編譯報(bào)錯(cuò)棠枉,運(yùn)行時(shí)的同名參數(shù)
關(guān)聯(lián)對(duì)象
1浓体、能否為分類添加“成員變量”?
可以辈讶,使用關(guān)聯(lián)對(duì)象實(shí)現(xiàn)命浴。
/*
通過key獲取關(guān)聯(lián)對(duì)象
**/
id objc_getAssociatedObject(id object,const void *key);
/*
關(guān)聯(lián)對(duì)象
**/
void objc_setAssociatedObject(id object,const void *key,id value,objc_AssociationPolicy policy);
/*
移除關(guān)聯(lián)對(duì)象
**/
void objc_removeAssociatedObjects(id object);
{
"0x492192132319":{
"@selector(text)" : {
"value":"Hello","policy":"retain"
},
"@selector(title)" : {
“value” : "a object","policy":"copy"
}
},
}
2、分類添加“成員變量”贱除,它添加到哪兒了呢生闲?
關(guān)聯(lián)對(duì)象由AssociationsManager管理并在AssociationsHashMap存儲(chǔ)。所有對(duì)象的關(guān)聯(lián)內(nèi)容都在同一個(gè)全局容器中月幌。
AssociationsHashMap -> DISGUISE(obj) : ObjectAssociationMap
ObjectAssociationMap -> @selector(text) : ObjcAssociation 一個(gè)實(shí)例可以添加多個(gè)關(guān)聯(lián)對(duì)象
ObjcAssociation -> OBJC_ASSOCIATION_COPY_NONATOMIC @"Hello"
擴(kuò)展
1碍讯、什么是擴(kuò)展?
- 聲明私有屬性
- 聲明私有方法
- 聲明私有成員變量
2扯躺、分類和擴(kuò)展區(qū)別捉兴?
- 擴(kuò)展是編譯時(shí)決議,分類是運(yùn)行時(shí)決議
- 只以聲明的形式存在录语,多數(shù)情況下寄生于宿主類.m中倍啥,實(shí)現(xiàn)也在.m文件中
- 不能以系統(tǒng)類添加擴(kuò)展
代理
1、什么是代理澎埠?是一種設(shè)計(jì)模式虽缕;@protocol形式體現(xiàn);一對(duì)一
通知
1蒲稳、使用觀察者模式來實(shí)現(xiàn)跨層傳遞消息的機(jī)制
2氮趋、你如何實(shí)現(xiàn)通知?NSNotification
- 全局維護(hù)一個(gè)Notification_Map表弟塞,表中key為notificationName凭峡,value為監(jiān)聽者列表Observers_List;
- list包含回調(diào)方法的數(shù)據(jù)信息决记。
KVO
1.觀察者涉及模式的一種實(shí)現(xiàn)
2.isa混寫技術(shù)實(shí)現(xiàn)KVO
- 原理:使用觀察者監(jiān)聽A的某一屬性摧冀,系統(tǒng)會(huì)利用運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建NSKVONotifying_A,并且將A的isa指針指向NSKVONotifying_A系宫,并且重寫setterA的方法索昂。一旦調(diào)用NSKVONotifying_A重寫的setter方法,便可以執(zhí)行自定義的事件扩借。
- 通過KVC設(shè)置能否使value生效椒惨?可以。setValue:forKey調(diào)用了setter方法
- 通過成員變量直接賦值value能否生效潮罪?不可以康谆。需要手動(dòng)添加KVO的兩個(gè)方法才會(huì)生效
KVC
1.KVC會(huì)破壞面向?qū)ο蟮木幊趟枷搿?/h5>
屬性關(guān)鍵字
- 讀寫權(quán)限
readonly
- 原子性
atomic:可以保障賦值和獲取線程安全领斥。添加和移除不保障線程安全。如NSArray
nonatomic
- 引用計(jì)數(shù)
retain/strong
assing/unsafe_unretained
weak
copy
1.assign和weak的區(qū)別沃暗?
readonly
atomic:可以保障賦值和獲取線程安全领斥。添加和移除不保障線程安全。如NSArray
nonatomic
retain/strong
assing/unsafe_unretained
weak
copy
類別 | 修飾對(duì)象 | 引用計(jì)數(shù) | 懸垂指針 |
---|---|---|---|
assign | 修飾基本數(shù)據(jù)類型 | 不改變 | 會(huì)產(chǎn)生 |
weak | 對(duì)象 | 不改變 | 不會(huì)產(chǎn)生 |
1.weak修飾對(duì)象月洛,assign修飾對(duì)象和基本數(shù)據(jù)類型
2.assign修飾的對(duì)象,被廢棄指向原地址孽锥,會(huì)出現(xiàn)野指針嚼黔。weak修飾的會(huì)nil。
2.淺拷貝和深拷貝
淺拷貝沒有開辟內(nèi)存惜辑,引用計(jì)數(shù)+1
深拷貝開辟兩片內(nèi)容相同的內(nèi)存空間唬涧,引用計(jì)數(shù)器不+1
NSString、NSArray盛撑、NSDictory的深淺拷貝
- 可變對(duì)象的copy和mutableCopy都是深拷貝
- 不可變對(duì)象的copy是淺拷貝碎节,mutableCopy是深拷貝
- copy方法返回的都是不可變對(duì)象