UI控件property參數(shù)

聲明UI控件屬性一般情況下形如@property (weak, nonatomic) UIImageView *imgView;property參數(shù)為weak。

 self.imgView = [[UIImageView alloc]init];
 [self.view addSubview:self.imgView];

在ARC環(huán)境下是不允許的,因為沒有強指針指向的對象,一創(chuàng)建出來馬上就被釋放掉。

那如果@property (strong, nonatomic) UIImageView *imgView;把UI控件的property參數(shù)改為strong呢?這種情況下,就不會出現(xiàn)一創(chuàng)建就被釋放的問題,但為什么聲明UI控件屬性都要用weak參數(shù)呢?

使用weak參數(shù)的原因

1.viewController強引用self.view(UIView)的根視圖@property(null_resettable, nonatomic,strong) UIView *view;
2.UIView 強引用NSArray subviews@property(nonatomic,readonly,copy) NSArray<__kindof UIView *> *subviews;copy也是強引用
3.subviews強引用子view(-addSubview:方法api文檔里面說會對子view建立強引用)
4.如果把UI控件的property參數(shù)設(shè)為strong,那么viewcontroller會對UI控件進行強引用。


UI控件的property參數(shù)如果設(shè)為strong,那么此時控件就被兩個對象強引用了,如果其中一個對象忘記釋放,那么控件對象就不能被釋放掉。
(不過好像用strong問題也不大,如果控制器被銷毀了,vc強引用釋放,subviews的強引用也會被銷毀。不過還是用weak比較好?)

weak和assign

既然不能使用strong,那么如果UI控件的property參數(shù)使用assign的話又會怎樣呢?

@property (nonatomic ,assign)UIButton *btn;

self.btn = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
[self.btn setBackgroundColor:[UIColor yellowColor]];
[self.view addSubview:self.btn];

打開僵尸對象檢測,運行代碼會報僵尸對象的錯誤。在ARC環(huán)境下,這個按鈕同樣是一創(chuàng)建出來就被釋放掉,但為什么會報錯?
原因:
weak指針指向的對象(在堆內(nèi)存)被銷毀之后,weak指針就自動做清空操作(賦值為nil。指向0地址?)
assign指針指向的對象被銷毀之后,指針指向原來堆內(nèi)存中的那個地址,訪問了一塊壞的內(nèi)存 造成野指針錯誤(僵尸對象)
如果是在MRC環(huán)境下,把weak換為assign則不會報錯。

UI控件的代理delegate屬性要聲明為weak

因為vc對控件強引用,如果delegate聲明為strong,UI控件代理一般指向vc本身,那么就會造成循環(huán)引用。
不過非UI控件的delegate的屬性聲明是weak還是strong就要視情況而定。

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

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

  • 1.屬性readwrite,readonly,assign,retain,copy,nonatomic 各是什么作...
    曾令偉閱讀 1,130評論 0 10
  • iOS開發(fā)中, 之前一直使用swift, 因此對于Objective-C的內(nèi)存管理機制長期處于混亂的一知半解狀態(tài)....
    icetime17閱讀 947評論 1 8
  • 1. 單例寫法 單例模式確保某一個類只有一個實例,而且自行實例化并向整個系統(tǒng)提供這個實例。 一般情況下, 如果一個...
    sellse閱讀 1,091評論 0 1
  • 我二十的時候說,如果三十歲了,臉上全是褶,那得多可怕。活到五十,我就自殺。很明顯我已經(jīng)改變主意了。甚至開始大言不慚...
    藤青城閱讀 356評論 4 5
  • 日思Vol.4:互聯(lián)網(wǎng)歷史觀 2017.4.19 身處在互聯(lián)網(wǎng)時代,身處在互聯(lián)網(wǎng)的漩渦中心,總會有種「我在見證歷史...
    隨易閱讀 965評論 7 5

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