一、 property有哪些屬性修飾詞?
atomic nonatomic strong weak copy assign readwrite readonly
getter setter unsafe_unretained nononull nullable null_resetable
寫在后面:
Q:ARC下property的默認(rèn)關(guān)鍵字是?
A:@property()CGFloat marginLeft;// 修飾基本數(shù)據(jù)類型默認(rèn)的關(guān)鍵字是atomic,readwrite,assign。
@property()NSObject *obj;// 修飾普通OC對象默認(rèn)的關(guān)鍵字是atomic,readwrite,strong。
二、 weak和assign的區(qū)別
· weak 只可以修飾對象。如果修飾基本數(shù)據(jù)類型,編譯器會(huì)報(bào)錯(cuò) - “property with ‘weak’ attribute must be of object type”。
weak 適用于delegate和block等引用類型,還有自定義IBOutlet控件也使用weak修飾,不會(huì)導(dǎo)致野指針問題,也不會(huì)循環(huán)引用,非常安全。
· assign 可修飾基本數(shù)據(jù)類型,也可修飾對象。但是當(dāng)修飾對象類型時(shí),MRC時(shí)代使用unsafe_unretained修飾。ARC下使用assign修飾對象也可看作是unsafe_unretained,這就可能會(huì)產(chǎn)生野指針。
Q:`weak`不會(huì)造成野指針問題的原因:
A:`weak` 不會(huì)產(chǎn)生野指針問題,因?yàn)閣eak修飾的對象釋放后(引用計(jì)數(shù)器值為0),指針會(huì)自動(dòng)被置nil,之后再向該對象發(fā)消息也不會(huì)崩潰。 weak是安全的。
Q:`assign`可能會(huì)造成野指針問題的原因:
A:`assign` 如果修飾對象,會(huì)產(chǎn)生野指針問題;如果修飾基本數(shù)據(jù)類型則是安全的。修飾的對象釋放后,指針不會(huì)自動(dòng)被置空,此時(shí)向?qū)ο蟀l(fā)消息會(huì)崩潰。
寫在后面:
Q:weak修飾的對象釋放后,指針被置為nil的過程?
A:runtime對注冊的類,會(huì)進(jìn)行布局,對于weak對象會(huì)放入一個(gè)hash表中,用weak指向的對象的內(nèi)存地址作為key,當(dāng)次對象的引用計(jì)數(shù)為0時(shí)會(huì)dealloc,假如weak指向的對象的內(nèi)存地址是a,那么就會(huì)以a為鍵,在這個(gè)hash表中搜索,找到所有以a為鍵的weak對象,從而置為nil。
三、strong和weak的區(qū)別
·weak是弱引用,strong是強(qiáng)引用,strong修飾的屬性一般不會(huì)自動(dòng)釋放;
· 在OC實(shí)際開發(fā)中屬性對象一般用strong來修飾,在使用懶加載定義控件的時(shí)候,一般也用strong。
·在使用 sb 或者 xib 給控件拖線的時(shí)候,拖出來的屬性都是用 weak 修飾的
寫在后面:
Q:使用sb或者xib給控件拖線的時(shí)候,拖出來的屬性都是用 weak 修飾的 ?
@property (weak, nonatomic) IBOutlet UILabel *label;
A:在向xib或者sb里面添加控件的時(shí)候,添加的子視圖是添加到了根視圖View上面, 而控制器對其根視圖 View默認(rèn)是強(qiáng)引用的,當(dāng)我們的子控件添加到View上面的時(shí)候,[self.view addSubView: self.mainView] ;這個(gè)方法會(huì)對添加的控件進(jìn)行強(qiáng)引用,如果在用strong對添加的子控件進(jìn)行修飾的話,相當(dāng)于有兩條強(qiáng)指針對子控件進(jìn)行強(qiáng)引用, 為了避免這種情況,所以用weak修飾.
四、什么情況下使用copy關(guān)鍵字?
- 修飾
NSString,NSArray,NSDictionary,NSNumber,NSString等經(jīng)常使用copy關(guān)鍵字:
因?yàn)樗麄冇邢鄳?yīng)的可變類型。
- 注意:
NSMutableArray,NSMutableDictionary,NSMutableString等經(jīng)常使用strong關(guān)鍵字 - 理由:
--NSArray類型使用copy修飾,防止值和類型被意外修改; 使用strong修飾時(shí),值和類型可能會(huì)被修改;
--NSMutableArray使用strong修飾,因?yàn)槿绻褂?code>copy修飾的話,創(chuàng)建的是不可變對象,再對不可變對象執(zhí)行增刪改操作就會(huì)crash.
-
block也經(jīng)常使用copy關(guān)鍵字:
block使用copy是從MRC上遺留下來的傳統(tǒng),在MRC中,方法內(nèi)部的block是放在棧區(qū)的,使用copy可以把它放在堆區(qū);在ARC中,使用copy和weak都可以。
寫在后面:
Q:block有什么類型,都存放在那里?
A:block一共有3種類型。
1._NSConcreateGloubalBlock,全局的靜態(tài)block,類似函數(shù),如果block里面不獲取任何外部變量,或者變量是全局作用域時(shí),如成員變量屬性,那么就是global類型。
2._NSConcreateStackBlock,保存在棧中的block,棧都是由系統(tǒng)管理內(nèi)存,當(dāng)函數(shù)返回時(shí)會(huì)被銷毀,__block類型的變量也會(huì)被銷毀,為了不被銷毀。block會(huì)將block和__block變量從??截惖蕉选?br> 3.__NSConcreateMallocBlock,保存在堆中的block,堆內(nèi)存由開發(fā)人員控制,當(dāng)引用計(jì)數(shù)為0時(shí)被銷毀。