寫在前面
? ? ? ? ? 最近公司需要招聘一名iOS開發,面試的人當中不乏工作了好幾年的老江湖,很多都有自己獨立開發的iOS項目甚至自己上傳到App Store的產品,今天面試的一個人讓我很是吃驚,關鍵點在于他只限于對于API的調用,忽視基礎知識的學習和總結,以及讓我感覺到他對于產品的性能、質量和項目代碼的維護、團隊進步的忽略。每個人都有惰性,我也不例外,結合自己的最近一段時間的學習,頗有感觸,也督促自己要不斷進步。從今天開始溫故以前的學習以及總結項目中碰到的問題,并養成寫博客和筆記的習慣。
第一節:iOS基礎之屬性關鍵字
? ? ? ? ? ? iOS開發屬性關鍵字是繞不開的話題,用好屬性關鍵字能很好的提高程序的質量,避免一些不必要的bug以及crash的出現。下面結合面試題總結一下屬性關鍵字的使用。
常見的屬性關鍵字:assign,weak,unsafe_unretained,strong,retain ,copy,readonly,readwrite , nonatomic,natomic及 __weak,__block ,@synthesize 和 @dynamic 等。
assign:修飾基本數據類型和NSObject對象。
weak:只能修飾NSObject對象,不能修飾基本數據類型。 主要用于避免循環引用。
面試題:weak與assign的區別?
延伸:為什么可以用assign修飾基本數據類型?堆與棧區別?
copy:類似 strong ,只能修飾 NSObject 對象,不能修飾基本數據類型。
面試題:什么情況下使用copy?延伸:深拷貝與淺拷貝區別?ARC下對象與基本數據類型默認的關鍵字是?
nonatomic:受線程影響,在get 一個屬性時, 不管是否有其他線程執行 set 方法, 只返回 get 結束時的 set 值。
atomic:不受其他線程的影響,在 get 一個屬性時,立馬給這個屬性在當前線程加一個鎖,只有當 get 完成后,才會解鎖,才會同步其他線程的 set 值。
面試題:atomic一定是線性安全?為什么?
@synthesize :如果你沒有手動實現 setter 方法和 getter 方法,那么編譯器會自動為你加上這兩個方法。
@dynamic: 告訴編譯器,屬性的 setter 與 getter 方法由用戶自己實現,不自動生成。(當然對于 readonly 的屬性只需提供 getter 即可)。假如一個屬性被聲明為 @dynamic var,然后你沒有提供 @setter 方法和 @getter 方法,編譯的時候沒問題,但是當程序運行到 instance.var = someVar,由于缺 setter 方法會導致程序崩潰;或者當運行到 someVar = var 時,由于缺 getter 方法同樣會導致崩潰。編譯時沒問題,運行時才執行相應的方法,這就是所謂的動態綁定。
其他的關鍵字:根據字面意思理解即可。
提高:使用copy修飾可變對象要注意什么?要改變私有屬性你有哪些辦法?
未完待續。。。。。。
參考文獻:
1,http://www.lxweimin.com/p/9b05f9268494