1. property 的作用是什么铡俐,有哪些關(guān)鍵詞,分別是什么含義妥粟?
http://www.reibang.com/p/af4edb0e6701
https://blog.csdn.net/wei371522/article/details/81206331
https://blog.csdn.net/nathan1987_/article/details/79099185
1.1 property
property,代表著 Class 的某個特性吏够,我們一般稱 property 為屬性
本質(zhì)上是由編譯器自動生成相應(yīng)的 ivar 成員變量勾给,和一對 access method:getter、setter 方法锅知。
1.2 關(guān)鍵字
1.2.1 ARC 下播急,不顯示指定屬性關(guān)鍵字時,默認關(guān)鍵字
1.基本數(shù)據(jù)類型:atomic readwrite assign
2.OC 對象: atomic readwrite strong null_unspecified
1.2.2 原子性
1. atomic 原子性(默認)
- atomic 使用的是自旋鎖售睹。當一個線程在獲取鎖的時候桩警,如果鎖已經(jīng)被其它線程獲取,那么該線程將循環(huán)判斷鎖是否能夠被成功獲取昌妹,直到獲取到鎖才會退出循環(huán)捶枢。獲取鎖的線程一直處于活躍狀態(tài),但是并沒有執(zhí)行任何有效的任務(wù)飞崖,使用這種鎖會造成 busy-waiting烂叔。
它區(qū)別于互斥鎖,互斥鎖會在拿不到鎖的時候會進入睡眠狀態(tài)固歪,當上一線程執(zhí)行完畢后蒜鸡,會被喚醒,然后再執(zhí)行牢裳。
從這個角度看逢防,自旋鎖會一直占用 CPU,因此可以說消耗一定的系統(tǒng)資源蒲讯,但響應(yīng)會比互斥鎖迅速忘朝。 - atomic 修飾的屬性,其 setter判帮、getter 方法要么全部自動合成辜伟,要么全部手動重寫氓侧。因為只重寫一個的話,無法保證其原子性导狡。
- atomic 只保證原子性约巷。原子性指的是一個操作不可以被CPU中途暫停,然后再調(diào)度旱捧。即不能被中斷独郎,要么就執(zhí)行完,要么就不執(zhí)行枚赡。即可以保證單個 getter 或者 setter 操作中不會被其他的 getter氓癌、setter 方法影響。換句話說贫橙,可以保證多線程條件下多個 getter贪婉、setter 方法時逐一進行的,但實際并不能保證 getter卢肃、setter 方法的執(zhí)行順序疲迂。所以也可以說是線程不安全的。
2. nonatomic:非原子性
1.2.2 內(nèi)存管理
assign莫湘、unsafe_unretained尤蒿、strong(strong)、weak(僅 ARC)幅垮、copy
1. unsafe_unretained 與 assign 的區(qū)別腰池?
- assign 誕生在 ARC 之前;
- unsafe_unretained 有相應(yīng)的修飾局部變量的修飾符 __unsafe_unretained忙芒。
2. assign 與 weak 的區(qū)別示弓?
http://www.reibang.com/p/d6c95656fad5
- weak 只可修飾對象,且會在對象被釋放時自動把指針值為 nil呵萨;
- 聲明 weak 指針后避乏,Runtime 會在 weak 指針前后插入幾句代碼,將 weak 指針與其引用對象的地址以 weak_entry 的形式存儲到 weak_table 哈希引用表中甘桑,分別對應(yīng) referent 和 referrers 兩個屬性拍皮。若 weak 指針定義了其他對象,則會先刪除舊的引用信息跑杭,再添加新的引用信息铆帽。若引用對象被釋放,則 Runtime 會 hash 出該對象德谅,找到其 referrers爹橱,遍歷該表令其指針為 nil。
- weak 修飾符是有代價的窄做,盡管代價很低愧驱。因此假若完全可以掌握一個對象的生命周期的情況下慰技,可以用 assign。
- assign 可以更好的與 C 語言交互组砚。
3. copy吻商、mutableCopy
- copy 修飾符會在 setter 方法中令對象執(zhí)行 copy 方法后再持有。目的是減弱對上下文的依賴糟红;
- NSObject 有 copy 和 mutableCopy艾帐,分別代表著不可變拷貝和可變拷貝。但實際上 NSObject 并未實現(xiàn)這兩個方法盆偿,只有遵守了 NSCopying 和 NSMutableCopying 兩個協(xié)議的對象才可以使用柒爸,比如 NSString、NSArray事扭、NSDictionary 和 NSSet捎稚。iOS 默認的實現(xiàn)中,copy 返回的結(jié)果一定是不可變對象求橄,mutableCopy 返回值一定是可變對象今野。
- 若執(zhí)行 copy 的是不可變對象,則返回的即是它本身谈撒;而 mutableCopy 是必回創(chuàng)建新對象的,可以稱之為深拷貝匾南。
1.2.3 null 相關(guān):均是編譯器行為啃匿,方便交互
- null_resettable:設(shè)置為 nil 則會重置。邏輯需自定義蛆楞。
1.3 @synthesize 和 @dynamic
- @synthesize 是手動指定成員變量的名稱溯乒。若同時重寫了 setter 與 getter,則編譯器不會自動生成成員變量豹爹,需手動指定裆悄。
- @dynamic 告訴編譯器:屬性的 setter 與 getter 方法由用戶自己實現(xiàn),不自動生成臂聋。
- 什么情況下光稼,編譯器會不自動合成屬性的成員變量?非 Declaration 和 Extension 中聲明的 property孩等,都不會自動合成艾君。比如 Category、Protocol 以及子類覆寫的 property肄方。
1.4 Category
https://tech.meituan.com/2015/03/03/diveintocategory.html
- Category 中只有屬性列表冰垄,但沒有成員變量列表。故不支持添加成員變量权她。
- 在 Category 中可以用 @property 來添加屬性虹茶,此種方式會自動生成對應(yīng)屬性的 setter 和 getter 方法的聲明逝薪,但由于沒有成員變量,因此也沒有 setter 和 getter 方法的實現(xiàn)蝴罪,需要手動實現(xiàn)董济。
- Category 的各個列表都是附加到元類對應(yīng)列表之前的,因此在效果上看可以覆蓋原類的方法洲炊。若多個 Category 覆寫元類方法感局,則會執(zhí)行最后一個加載的 Category 中的覆寫方法。
- ivar_list 的長度決定每個對象所占空間暂衡,method_list 只影響 class 的大小询微。因此,可附加 method狂巢,不可附加 ivar撑毛。
1.5 子類重載父類的 property?
若子類覆寫了父類的屬性(比如要修改其類型唧领、修飾符等等)藻雌,則編譯器不會為子類自動合成成員變量與 access method,而是由其父類實現(xiàn)斩个;也就是說胯杭,若想修改父類屬性的定義,則必須手動設(shè)定其成員變量與 access method受啥。
1.6 常用容器類 NSSet做个、NSArray、NSDictionary 如何選用關(guān)鍵詞滚局?
- 結(jié)論:mutable 用 strong居暖,靜態(tài)的用 copy。
- 原因:copy 會在 setter 方法中令 newObject 執(zhí)行 copy 方法藤肢。因此即使 newObject 為可變對象太闺,我們也能拿到相應(yīng)的不可變對象。
- strong 會直接持有原對象嘁圈,針對可變類型不會出現(xiàn)問題溉奕。若想實現(xiàn) copy 修飾符厚棵,可重寫 setter 方法宝踪。
- 可直接給成員變量賦值火本,這樣即使修飾符是 copy,也能通過 getter 方法拿到不可變對象温学。這也間接證明了 copy 只針對 setter 方法略贮。
2. KVC 和 KVO
http://www.reibang.com/p/b9f020a8b4c9
https://juejin.im/post/5ac5f4b46fb9a028d5675645
3. Runtime
Runtime 是什么?
http://www.reibang.com/p/51b4019a8df2
4. 遞歸
https://blog.csdn.net/YY_worhol/article/details/83617109
5.block
http://www.reibang.com/p/4e79e9a0dd82
6. GCD
http://www.reibang.com/p/2d57c72016c6
7.ARC
http://www.reibang.com/p/b13983e341fd
ARC 是自動引用計數(shù),MRC 是手動引用計數(shù)逃延;
自動引用計數(shù)是由編譯器完成的览妖,主要目的是在對象被強指針引用時自動插入 retain,強指針作用域結(jié)束時自動插入 release揽祥。
除了 retain 與 release 之外讽膏,其實還涉及到另外一點:autorelease 和 autoreleasepool。
autorelease 會將對象注冊進 autoreleasepool拄丰,而 autoreleasepool 會在其 drain 時向其內(nèi)保存的所有對象發(fā)送 release 消息府树。
什么場景會使用 autorelease?我創(chuàng)建了對象料按,但我不清楚什么時候要釋放它的情況奄侠。例如各類構(gòu)造方法,alloc 對象后即返回了载矿,但理論上我 alloc 我就要負責 release垄潮,但是做不到的情況下就只能 autorelease 到 autoreleasepool 中,令其代為釋放闷盔。
在 ARC 下弯洗,@autoreleasepool 的 block 前后,會分別加一句 push 和 pop逢勾,代表創(chuàng)建和 drain autoreleasepool牡整;
每一個線程都會維護一個 autoreleasepool,并在線程結(jié)束時釋放自己所有的 autoreleasepool溺拱。
事件循環(huán)的每個循環(huán)的開始在主線程上創(chuàng)建一個自動釋放池逃贝,并在結(jié)束時將其耗盡,從而釋放在處理事件時生成的任何自動釋放對象盟迟。
autoreleasepool 大結(jié)構(gòu)是一個雙向鏈表秋泳,小結(jié)構(gòu)是一個指針數(shù)組潦闲,存儲著所有被注冊進來的對象地址攒菠。
8.autoreleasepool
設(shè)計模式
http://www.reibang.com/p/e5c69c7b8c00NSNotificationCenter
http://www.reibang.com/p/e3a38b21420c