《iOS之一起進大廠》系列-iOS屬性關(guān)鍵字和相關(guān)的面試題

收錄:空杯子

前面的話


屬性關(guān)鍵字是iOS開發(fā)中的基礎脚翘。 基礎往往容易被忽略喜最,但是細節(jié)決定成敗艺挪。 如果面試時,忽然來一發(fā)屬性關(guān)鍵字相關(guān)的問題诉濒,回答的不好汗唱,那給面試官的印象就會差很多屡拨,成為了木桶短板的一個攻冷〈逼茫可能前面回答的好建立的優(yōu)勢就沒了。

開始面試


我正在會議室略有緊張的等待面試讲衫,忽然看到一個穿著格子襯衫,大腹便便的中年男子拿著簡歷向我走來孵班, 我看著他頭上快要絕頂?shù)念^發(fā)涉兽,心想這肯定是個iOS開發(fā)技術(shù)牛逼閃閃的老前輩。
還好看過《iOS之一起進大廠》系列篙程,我的知識很淵博枷畏,基礎很牢固,不慌虱饿。剛緊張到提到嗓子眼的心拥诡,又按下去了触趴。淡定從容,一點都不虛好伐渴肉,就是這么自信淡定冗懦。

我什么時候也能變成那樣厲害的高手

變強了

面試官:


小伙子,看你簡歷 仇祭,你對開發(fā)基礎了解的很透徹啊披蕉,那咱們今天就聊聊屬性關(guān)鍵字把。 你對屬性關(guān)鍵字怎么理解乌奇?

屬性關(guān)鍵字可以分為三種類型:


  • 讀寫權(quán)限的類型: readonly ,readwrite
  • 原子類 : atomic 没讲,nonatomic
  • 引用計數(shù) : retain/strong/copy,assign/unsafe_unretained礁苗,weak

讀寫權(quán)限的類型: readonly ,readwrite

  • readwrite 是可讀可寫特性爬凑;會自動生成getter方法和setter方法
  • readonly 是只讀特性 只會生成getter方法 ,不會生成setter方法

原子類: atomic nonatomic


atomic是保證賦值和獲取是線程安全的试伙。 這里說的是對成員屬性的直接賦值和獲取嘁信,并代表操作和訪問。 對于atomic的屬性迁霎,系統(tǒng)生成的 getter/setter 會保證 get吱抚、set 操作的完整性,不受其他線程影響考廉。

retain關(guān)鍵字


只有在MRC的環(huán)境下使用秘豹。 retain引起對象的引用計數(shù)加1, release引起引用計數(shù)減1,當引用計數(shù)為0時昌粤,dealloc函數(shù)被調(diào)用既绕,內(nèi)存被回收。

那你說說strong和weak的區(qū)別是涮坐?


strong 表示指向并擁有該對象凄贩。其修飾的對象引用計數(shù)會加1.該對象只要引用計數(shù)不為0則不會被銷毀。當然強制將其置為nil也可以銷毀它袱讹。 weak 表示指向但不擁有該對象疲扎。其修飾的對象引用計數(shù)不會增加。無需手動設置捷雕,該對象會自行在內(nèi)存中銷毀椒丧。

如何理解的atomic的線程安全呢,有沒有什么隱患救巷?


atomic對一個數(shù)組壶熏,進行賦值或獲取,是可以保證線程安全的浦译。但是如果進行數(shù)組進行操作棒假,比如給數(shù)據(jù)加對象或移除對象溯职,是不在atomic的保證范圍。

strong 和weak的區(qū)別帽哑?


strong 表示指向并擁有該對象谜酒。其修飾的對象引用計數(shù)會加1.該對象只要引用計數(shù)不為0則不會被銷毀。當然強制將其置為nil也可以銷毀它祝拯。 weak 表示指向但不擁有該對象甚带。其修飾的對象引用計數(shù)不會增加。無需手動設置佳头,該對象會自行在內(nèi)存中銷毀鹰贵。

assign 和weak的區(qū)別有哪些?


assign修飾基礎數(shù)據(jù)類型康嘉,int, BOOL
assign修飾對象類型碉输,不改變對象的引用計數(shù)。
assign 會產(chǎn)生懸垂指針亭珍, assign 的對象被釋放之后敷钾,對象指針還是會指向原來的地址,會產(chǎn)生懸垂指針 ,導致程序內(nèi)存泄露和程序崩潰肄梨。
weak不改變修飾對象的引用計數(shù)
所指向的對象在被釋放后自動設置為 nil.
他們的區(qū)別:
1阻荒、assign可以修飾對象和基本數(shù)據(jù)類型, weak只修飾對象
2、assign 所修飾的對象被釋放后众羡,還會指向原對象內(nèi)存地址侨赡。weak 所修飾的對象被廢棄之后,weak 所修飾對象會被設置為nil粱侣。
但是他們有一個共同點羊壹,他們都不會改變修飾對象的引用計數(shù)。

copy關(guān)鍵字影響了對象的可變和不可變屬性嗎齐婴?


可變對象(mutable)copy和mutableCopy都是深拷貝 不可變對象(immutable)的copy是淺拷貝,mutableCopy是深拷貝 copy方法返回的都是不可變對象,若被拷貝對象是可變對象,返回的也是不可變對象油猫。 例子解析如下:

淺拷貝和深拷貝的區(qū)別?


淺拷貝只是對 內(nèi)存地址的復制柠偶,兩個指針指向同一個地址情妖,增加被拷貝對象的引用計數(shù),沒有發(fā)生新的內(nèi)存分配诱担。
深拷貝:目標對象指針和源對象指針鲫售,指向兩片內(nèi)容相同的內(nèi)存空間。
2個特點:不會增加被拷貝對象的引用計數(shù)该肴,產(chǎn)生了新內(nèi)存分配,出現(xiàn)了2塊內(nèi)存藐不。
總結(jié)區(qū)別:
淺拷貝增加引用計數(shù)匀哄,不產(chǎn)生新的內(nèi)存秦效。
深拷貝不增加引用結(jié)束,會新分配內(nèi)存

NSMutableArray用copy修飾會出現(xiàn)什么問題?


出現(xiàn)調(diào)用可變方法不可控問題涎嚼,會導致程序崩潰阱州。 具體原因如下:
給Mutable 被聲明為copy修飾的屬性賦值, 過程描述如下:
1.如果賦值過來的是NSMutableArray對象,會對可變對象進行copy操作,拷貝結(jié)果是不可變的,那么copy后就是NSArray
2.如果賦值過來的是NSArray對象, 會對不可變對象進行copy操作,拷貝結(jié)果仍是不可變的,那么copy之后仍是NSArray法梯。
所以不論賦值過來的是什么對象,只要對NSMutableArray進行copy操作,返回的對象都是不可變的苔货。
那原來屬性聲明的是NSMutableArray,可能會調(diào)用了add或者remove方法,拷貝后的結(jié)果是不可變對象,所以一旦調(diào)用這些方法就會程序崩潰(crash)

MRC下如何重寫retain修飾變量的setter方法立哑?



這里關(guān)鍵點在于夜惭,如果恰好設置的是原來的對象铛绰,不做判斷的話敢会,就會導致把自己對象給釋放了,會導致程序訪問異常姐帚。所以需要先做判斷吏垮。

weak屬性修飾的變量,如何實現(xiàn)在變量沒有強引用后自動置為 nil 惫皱?


runtime 維護了一個weak_table_t 弱引用表 ,用于存儲指向某一個對象的所有weak指針。weak表其實是一個哈希表尤莺,
key是所指對象的地址旅敷,value是weak指針的地址的數(shù)組颤霎。
在對象回收的時候媳谁,根據(jù)對象的地址將所有weak指針地址的數(shù)組友酱,遍歷數(shù)組把其中的數(shù)據(jù)置為nil

__weak 和 _Unsafe_Unretain 的區(qū)別系羞?


weak 修飾的指針變量庐杨,在指向的內(nèi)存地址銷毀后各吨,會在 Runtime 的機制下,自動置為 nil树绩。
_Unsafe_Unretain不會置為 nil,容易出現(xiàn) 懸垂指針登下,發(fā)生崩潰篓冲。但是 _Unsafe_Unretain 比 __weak 效率高诽俯。

堅持看到這里的同學仙粱,你們個個都是人才硬霍,我好喜歡。


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末须尚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子侍咱,更是在濱河造成了極大的恐慌楔脯,老刑警劉巖撩轰,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡堪嫂,警方通過查閱死者的電腦和手機偎箫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來皆串,“玉大人淹办,你說我怎么就攤上這事《窀矗” “怎么了怜森?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谤牡。 經(jīng)常有香客問我副硅,道長,這世上最難降的妖魔是什么翅萤? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任恐疲,我火速辦了婚禮,結(jié)果婚禮上套么,老公的妹妹穿的比我還像新娘培己。我一直安慰自己,他們只是感情好违诗,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布漱凝。 她就那樣靜靜地躺著,像睡著了一般诸迟。 火紅的嫁衣襯著肌膚如雪茸炒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天阵苇,我揣著相機與錄音壁公,去河邊找鬼。 笑死绅项,一個胖子當著我的面吹牛紊册,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播快耿,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼囊陡,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了掀亥?” 一聲冷哼從身側(cè)響起撞反,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎搪花,沒想到半個月后遏片,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嘹害,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年吮便,在試婚紗的時候發(fā)現(xiàn)自己被綠了笔呀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡髓需,死狀恐怖许师,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情僚匆,我是刑警寧澤枯跑,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站白热,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏粗卜。R本人自食惡果不足惜屋确,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望续扔。 院中可真熱鬧攻臀,春花似錦、人聲如沸纱昧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽识脆。三九已至设联,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間灼捂,已是汗流浹背离例。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留悉稠,地道東北人宫蛆。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像的猛,于是被迫代替她去往敵國和親耀盗。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容