iOS 屬性修飾詞

一、 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,readwritestrong。



二、 weakassign的區(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


三、strongweak的區(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)鍵字?
  1. 修飾NSStringNSArray,NSDictionary,NSNumber,NSString等經(jīng)常使用copy關(guān)鍵字:
    因?yàn)樗麄冇邢鄳?yīng)的可變類型。
  • 注意:NSMutableArrayNSMutableDictionary,NSMutableString等經(jīng)常使用strong關(guān)鍵字
  • 理由:
    -- NSArray類型使用copy修飾,防止值和類型被意外修改; 使用strong修飾時(shí),值和類型可能會(huì)被修改;
    -- NSMutableArray使用strong修飾,因?yàn)槿绻褂?code>copy修飾的話,創(chuàng)建的是不可變對象,再對不可變對象執(zhí)行增刪改操作就會(huì)crash.
  1. block也經(jīng)常使用copy關(guān)鍵字:
    block使用copy是從MRC上遺留下來的傳統(tǒng),在MRC中,方法內(nèi)部的block是放在棧區(qū)的,使用copy可以把它放在堆區(qū);在ARC中,使用copyweak都可以。

寫在后面:
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í)被銷毀。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,667評論 1 32
  • 屬性修飾符簡述 ios5之前是MRC,內(nèi)存需要程序員進(jìn)行管理,ios5之后是ARC,除非特殊情況,比如C框架或者循...
    咖啡綠茶1991閱讀 831評論 0 2
  • 很多人講屬性修飾詞的時(shí)候,喜歡從字面或者定義的角度介紹它們間的區(qū)別。這篇文章,我們側(cè)重從修飾詞對setter方法的...
    小碼僧閱讀 3,545評論 1 18
  • 今天早上和小伙伴交流上周的培訓(xùn)收獲,她說她覺得我的學(xué)習(xí)能力很強(qiáng),比她吸收快還能表達(dá)出來、知道怎么用,問我是不...
    火韋木南閱讀 544評論 2 1
  • 【作者簡介】 我是一個(gè)在農(nóng)村出生、成長的普通孩子,家境并不富裕。我不高不漂亮不聰明,但也不算特別差。我經(jīng)常想,像我...
    妤淑閱讀 575評論 2 2

友情鏈接更多精彩內(nèi)容