分類四類:
1. ?原子性 ?--- ?nonatomic
默認(rèn)是atomic,是使用同步鎖。編譯器會(huì)添加額外的代碼用于編寫多線程程序,OC對(duì)象基本都用nonatomic,因?yàn)檫@個(gè)修飾符并不能保證真正的同步機(jī)制。
2. ? 訪問(wèn)權(quán)限 ?--- ?readwrite(默認(rèn)),readonly
默認(rèn)是readwrite,可讀可寫。readonly只讀,只生成getter方法。(如果重寫了getter方法,編譯器的自動(dòng)合成會(huì)失效)。
3. ?內(nèi)存管理語(yǔ)義
4. ?存取方法名稱 ?--- ?getter=,setter=(不常用)
5. ?不常用 ?--- ?nonnull,null_resettable,nullable(一些系統(tǒng)方法中會(huì)出現(xiàn))
fig_1 解釋:
1.? strong 與 __strong 語(yǔ)義相同,都表示強(qiáng)引用
? ? ? 變量聲明默認(rèn)帶有 __strong 關(guān)鍵字。
2. ?weak 與 __weak 語(yǔ)義相同(iOS 5之后),都表示弱引用
? ? ? __weak修飾的對(duì)象表示一種非擁有關(guān)系(ownership), 當(dāng)對(duì)象所指內(nèi)存空間被釋放時(shí), ? ? ? ? ? ? ? 對(duì)象值(地址)會(huì)被自動(dòng)置nil ,概念如圖fig_3(必須用于OC對(duì)象)
ps: 強(qiáng)引用
? ? ? ?弱引用
3. ?unsafe_unretained 與 __unsafe_unretained 語(yǔ)義相同(iOS 5之前),都表示弱引用
__unsafe_unretained 與 __weak 類似,區(qū)別在于前者不會(huì)將修飾的對(duì)象自動(dòng)置nil,此時(shí),對(duì)象所指的內(nèi)存空間已經(jīng)被釋放,對(duì)象本身值(地址) 還在,這時(shí)對(duì)象就是野指針,再向?qū)ο蟀l(fā)送消息,程序就會(huì)崩潰,會(huì)出現(xiàn)「BAD_ACCESS」錯(cuò)誤。
4. ?copy 與 strong 語(yǔ)義相同,都表示強(qiáng)引用
區(qū)別是 修飾變量是拷貝對(duì)象的持有者,會(huì)copy一個(gè)不可變的副本。
5. ?assign 一般用于純量類型修飾(int,float,double,bool...)可以用于非OC對(duì)象。
assign不會(huì)自動(dòng)置nil。
ps: 對(duì)于基礎(chǔ)數(shù)據(jù)類型,默認(rèn)修飾為:@property(atomic,readwrite,assign)
? ? ? ? ? 對(duì)于OC對(duì)象類型,默認(rèn)修飾為: @property(atomic,readwrite,strong)
6. ?retain 與 strong 語(yǔ)義相同
BTW:
__autoreleasing 該關(guān)鍵字使對(duì)像延遲釋放。兩種應(yīng)用場(chǎng)景:
(1) 在一個(gè)函數(shù)中定義,傳入另一個(gè)函數(shù)中申請(qǐng)內(nèi)存空間,形參需要使用
(2) 遵循 “誰(shuí)申請(qǐng),誰(shuí)釋放” 原則,函數(shù)返回值需要使用
extension
1. ?什么時(shí)候用 strong 和 weak ?
用 strong: ARC下OC對(duì)象默認(rèn)是使用 strong,自定義OC對(duì)象也一樣。
用?weak: (1)OC當(dāng)中會(huì)出現(xiàn)循環(huán)引用的問(wèn)題,循環(huán)引用的解決方法就是將對(duì)其中一方的引用改為weak。(2)已經(jīng)對(duì)某對(duì)象進(jìn)行了強(qiáng)引用,二次引用時(shí)使用 weak。
2. ?IBOutlet連出來(lái)的視圖屬性為什么可以被設(shè)置成weak ?
(1) 解釋:
首先,從IB中拖出到VC中的控件一般默認(rèn)是 weak 屬性修飾的。
根據(jù)蘋果開(kāi)發(fā)者文檔?Managing the Lifetimes of Objects from Nib Files?:
? ? ? 一般需要強(qiáng)引用nib中top-level的對(duì)象,確保它不被釋放掉。不需要強(qiáng)引用比對(duì)象低級(jí)的對(duì)象,如 VC中的btn。因?yàn)樗鼈儽旧砭蛯儆诟割悺?/p>
? ? ? Outlets 一般用weak,除了在nib文件中 from File’s Owner to top-level object(在nib中根級(jí)別的對(duì)象,例如在nib中,初始化另一個(gè)view,它不是一個(gè)mainView的subView)的對(duì)象應(yīng)該用strong。
(2) 回答:
UI控件一般使用weak,因?yàn)樵赨I控件通常被父控件的subViews數(shù)組強(qiáng)引用著。
使用storyboard(xib不行)創(chuàng)建的vc,會(huì)有一個(gè)叫_topLevelObjectsToKeepAliveFromStoryboard的私有數(shù)組強(qiáng)引用所有top level的對(duì)象,所以這時(shí)即便outlet聲明成weak也沒(méi)關(guān)系
ps:
(1) nib中根級(jí)別的對(duì)象:你一打開(kāi)nib,出現(xiàn)在左側(cè)列表中的對(duì)象。所有的nibs都有UIView,這是唯一的根級(jí)別對(duì)象。如果增加別的View,在列表中,這個(gè)View就是根級(jí)別對(duì)象。
3. ?runtime 是如何實(shí)現(xiàn) weak 的 ?
runtime在注冊(cè)類時(shí),會(huì)進(jìn)行布局,將weak對(duì)象所指向內(nèi)存空間的地址作為key,weak對(duì)象自身的地址作為value,然后把這條記錄加入到hash表中。 例如:weak對(duì)象foo,(key,value)= (foo,&foo),加入到hash表中。當(dāng)weak對(duì)象的retainCount = 0時(shí),通過(guò)foo去hash表中找這條記錄,然后對(duì)&foo = nil。最后,刪除這條記錄。
4. ?什么時(shí)候用 copy ?
OC對(duì)象中copy一般用于NSString,NSArray,NSDictionary,NSSet,因?yàn)樗鼈冇袑?duì)應(yīng)的mutable類型??勺兒筒豢勺冎g會(huì)進(jìn)行賦值操作,為了確保對(duì)象中字符串的值不會(huì)無(wú)意間被改動(dòng),一般會(huì)用copy關(guān)鍵字拷貝一份不可變的副本進(jìn)行使用。(為了保證屬性的封裝性)
block也經(jīng)常用copy。在ARC下對(duì)block的 copy 和 strong 語(yǔ)義相同。
5. ? 如何讓自己的類用copy修飾符? 如何重寫帶copy關(guān)鍵字的setter?
(1)自定義對(duì)象可變實(shí)現(xiàn)<NSMutableCopying>,不可變實(shí)現(xiàn)<NSCopying>。
? ? ? ? ?實(shí)現(xiàn)協(xié)議中唯一的方法:
? ? ? ? ?- ?(id) copyWithZone:(NSZone ?*) zone;
(2)
引文: