聲明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就要視情況而定。