Interview

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 原子性(默認)

  1. atomic 使用的是自旋鎖售睹。當一個線程在獲取鎖的時候桩警,如果鎖已經(jīng)被其它線程獲取,那么該線程將循環(huán)判斷鎖是否能夠被成功獲取昌妹,直到獲取到鎖才會退出循環(huán)捶枢。獲取鎖的線程一直處于活躍狀態(tài),但是并沒有執(zhí)行任何有效的任務(wù)飞崖,使用這種鎖會造成 busy-waiting烂叔。
    它區(qū)別于互斥鎖,互斥鎖會在拿不到鎖的時候會進入睡眠狀態(tài)固歪,當上一線程執(zhí)行完畢后蒜鸡,會被喚醒,然后再執(zhí)行牢裳。
    從這個角度看逢防,自旋鎖會一直占用 CPU,因此可以說消耗一定的系統(tǒng)資源蒲讯,但響應(yīng)會比互斥鎖迅速忘朝。
  2. atomic 修飾的屬性,其 setter判帮、getter 方法要么全部自動合成辜伟,要么全部手動重寫氓侧。因為只重寫一個的話,無法保證其原子性导狡。
  3. 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ū)別腰池?

  1. assign 誕生在 ARC 之前;
  2. unsafe_unretained 有相應(yīng)的修飾局部變量的修飾符 __unsafe_unretained忙芒。

2. assign 與 weak 的區(qū)別示弓?

http://www.reibang.com/p/d6c95656fad5

  1. weak 只可修飾對象,且會在對象被釋放時自動把指針值為 nil呵萨;
  2. 聲明 weak 指針后避乏,Runtime 會在 weak 指針前后插入幾句代碼,將 weak 指針與其引用對象的地址以 weak_entry 的形式存儲到 weak_table 哈希引用表中甘桑,分別對應(yīng) referent 和 referrers 兩個屬性拍皮。若 weak 指針定義了其他對象,則會先刪除舊的引用信息跑杭,再添加新的引用信息铆帽。若引用對象被釋放,則 Runtime 會 hash 出該對象德谅,找到其 referrers爹橱,遍歷該表令其指針為 nil。
  3. weak 修飾符是有代價的窄做,盡管代價很低愧驱。因此假若完全可以掌握一個對象的生命周期的情況下慰技,可以用 assign。
  4. assign 可以更好的與 C 語言交互组砚。

3. copy吻商、mutableCopy

  1. copy 修飾符會在 setter 方法中令對象執(zhí)行 copy 方法后再持有。目的是減弱對上下文的依賴糟红;
  2. NSObject 有 copy 和 mutableCopy艾帐,分別代表著不可變拷貝和可變拷貝。但實際上 NSObject 并未實現(xiàn)這兩個方法盆偿,只有遵守了 NSCopying 和 NSMutableCopying 兩個協(xié)議的對象才可以使用柒爸,比如 NSString、NSArray事扭、NSDictionary 和 NSSet捎稚。iOS 默認的實現(xiàn)中,copy 返回的結(jié)果一定是不可變對象求橄,mutableCopy 返回值一定是可變對象今野。
  3. 若執(zhí)行 copy 的是不可變對象,則返回的即是它本身谈撒;而 mutableCopy 是必回創(chuàng)建新對象的,可以稱之為深拷貝匾南。

1.2.3 null 相關(guān):均是編譯器行為啃匿,方便交互

  1. null_resettable:設(shè)置為 nil 則會重置。邏輯需自定義蛆楞。

1.3 @synthesize 和 @dynamic

  1. @synthesize 是手動指定成員變量的名稱溯乒。若同時重寫了 setter 與 getter,則編譯器不會自動生成成員變量豹爹,需手動指定裆悄。
  2. @dynamic 告訴編譯器:屬性的 setter 與 getter 方法由用戶自己實現(xiàn),不自動生成臂聋。
  3. 什么情況下光稼,編譯器會不自動合成屬性的成員變量?非 Declaration 和 Extension 中聲明的 property孩等,都不會自動合成艾君。比如 Category、Protocol 以及子類覆寫的 property肄方。

1.4 Category

https://tech.meituan.com/2015/03/03/diveintocategory.html

  1. Category 中只有屬性列表冰垄,但沒有成員變量列表。故不支持添加成員變量权她。
  2. 在 Category 中可以用 @property 來添加屬性虹茶,此種方式會自動生成對應(yīng)屬性的 setter 和 getter 方法的聲明逝薪,但由于沒有成員變量,因此也沒有 setter 和 getter 方法的實現(xiàn)蝴罪,需要手動實現(xiàn)董济。
  3. Category 的各個列表都是附加到元類對應(yīng)列表之前的,因此在效果上看可以覆蓋原類的方法洲炊。若多個 Category 覆寫元類方法感局,則會執(zhí)行最后一個加載的 Category 中的覆寫方法。
  4. ivar_list 的長度決定每個對象所占空間暂衡,method_list 只影響 class 的大小询微。因此,可附加 method狂巢,不可附加 ivar撑毛。

1.5 子類重載父類的 property?

若子類覆寫了父類的屬性(比如要修改其類型唧领、修飾符等等)藻雌,則編譯器不會為子類自動合成成員變量與 access method,而是由其父類實現(xiàn)斩个;也就是說胯杭,若想修改父類屬性的定義,則必須手動設(shè)定其成員變量與 access method受啥。

1.6 常用容器類 NSSet做个、NSArray、NSDictionary 如何選用關(guān)鍵詞滚局?

  1. 結(jié)論:mutable 用 strong居暖,靜態(tài)的用 copy。
  2. 原因:copy 會在 setter 方法中令 newObject 執(zhí)行 copy 方法藤肢。因此即使 newObject 為可變對象太闺,我們也能拿到相應(yīng)的不可變對象。
  3. strong 會直接持有原對象嘁圈,針對可變類型不會出現(xiàn)問題溉奕。若想實現(xiàn) copy 修飾符厚棵,可重寫 setter 方法宝踪。
  4. 可直接給成員變量賦值火本,這樣即使修飾符是 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

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html#//apple_ref/doc/uid/20000047-CJBFBEDI

  1. 設(shè)計模式
    http://www.reibang.com/p/e5c69c7b8c00

  2. NSNotificationCenter
    http://www.reibang.com/p/e3a38b21420c

  3. 事件傳遞鏈
    http://www.reibang.com/p/f9967f1a0ac1

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市歉闰,隨后出現(xiàn)的幾起案子辖众,更是在濱河造成了極大的恐慌,老刑警劉巖和敬,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凹炸,死亡現(xiàn)場離奇詭異,居然都是意外死亡昼弟,警方通過查閱死者的電腦和手機啤它,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人变骡,你說我怎么就攤上這事离赫。” “怎么了塌碌?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵渊胸,是天一觀的道長。 經(jīng)常有香客問我台妆,道長翎猛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任接剩,我火速辦了婚禮切厘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘搂漠。我一直安慰自己迂卢,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布桐汤。 她就那樣靜靜地躺著而克,像睡著了一般。 火紅的嫁衣襯著肌膚如雪怔毛。 梳的紋絲不亂的頭發(fā)上员萍,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音拣度,去河邊找鬼碎绎。 笑死,一個胖子當著我的面吹牛抗果,可吹牛的內(nèi)容都是我干的筋帖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼冤馏,長吁一口氣:“原來是場噩夢啊……” “哼日麸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起逮光,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤代箭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后涕刚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗡综,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年杜漠,在試婚紗的時候發(fā)現(xiàn)自己被綠了极景。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片察净。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖盼樟,靈堂內(nèi)的尸體忽然破棺而出塞绿,到底是詐尸還是另有隱情,我是刑警寧澤恤批,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布异吻,位于F島的核電站,受9級特大地震影響喜庞,放射性物質(zhì)發(fā)生泄漏诀浪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一延都、第九天 我趴在偏房一處隱蔽的房頂上張望雷猪。 院中可真熱鬧,春花似錦晰房、人聲如沸求摇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽与境。三九已至,卻和暖如春猖吴,著一層夾襖步出監(jiān)牢的瞬間摔刁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工海蔽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留共屈,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓党窜,卻偏偏與公主長得像拗引,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子幌衣,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345