iOS控件中的weak與strong

0x0.問題導(dǎo)入:weak與strong在控件定義時的糾結(jié)

weak與strong在控件定義過程中時常用到掂之,通常使用xib拖動出來的使用weak宛官,純代碼編寫也有使用weak也有strong,如下:

@property (weak, nonatomic) IBOutlet UILabel *weakLabel;
@property (weak, nonatomic) UILabel *weakLabel2;
@property (strong, nonatomic) UILabel *strongLabel;

這三種各自的區(qū)別在哪,接著來實驗一下:

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *weakLabel;
@property (weak, nonatomic) UILabel *weakLabel2;
@property (strong, nonatomic) UILabel *strongLabel;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //控件初始化
    UILabel *labTemp = [[UILabel alloc]init];
    labTemp.frame = CGRectMake(50, 60, 100, 21);
    labTemp.text = @"weakLabel2";
    self.weakLabel2 = labTemp;
    //如果labTemp沒有addSubview到self.view中,_weakLabel2將在viewDidLoad執(zhí)行完后釋放
    [self.view addSubview:labTemp];
    
    [self.view addSubview:self.strongLabel];
    
    /*
     代碼實現(xiàn)控件弱引用,提示: ("Warning: Assigning retained object to weak variable; object will be released after assignment")
     這是因為對象沒有擁有者,在創(chuàng)建之后就會被立即釋放
    */
//    _weakLabel2 = [[UILabel alloc]init];
//    _weakLabel2.frame = CGRectMake(50, 60, 100, 21);
//    _weakLabel2.text = @"weakLabel2";
//    [self.view addSubview:_weakLabel2];
    
    //1.對三種定義方式進行移除
    [self.weakLabel removeFromSuperview];
    [self.weakLabel2 removeFromSuperview];
    [self.strongLabel removeFromSuperview];
}

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    //2.移除后進行添加[之所以放這方法測試技竟,是因為remove后有釋放延遲]
    [self.view addSubview:_weakLabel];
    [self.view addSubview:_weakLabel2];
    [self.view addSubview:_strongLabel];

    NSLog(@"_weakLabel --> %@",_weakLabel);
    NSLog(@"_weakLabel2 --> %@",_weakLabel2);
    NSLog(@"_strongLabel --> %@",_strongLabel);
}

#pragma mark - getter
-(UILabel*)strongLabel{
    if(!_strongLabel){
        _strongLabel = [[UILabel alloc]init];
        _strongLabel.text = @"strongLabel";
        _strongLabel.frame = CGRectMake(50, 100, 100, 21);
    }
    return _strongLabel;
}
@end

結(jié)果


t1.png

0x1.weak與strong關(guān)鍵字特性

弱引用weak,即當(dāng)對象在釋放之后晚胡,指針地址被置為nil
強引用strong灵奖,進行retain+1操作嚼沿,對象持有

0x2.controller中控件生命周期

  • IB中outlet的控件:UIViewController->UIView->subView->UILabel
    @property(null_resettable, nonatomic,strong) UIView *view;
    UIViewController中self.view是個strong類型,當(dāng)系統(tǒng)將
    @property (weak, nonatomic) IBOutlet UILabel *weakLabel;
    add到self.view時瓷患,也就是說weakLabel已經(jīng)被強引用一次骡尽,所以一般不再使用strong進行修飾;當(dāng)控制器釋放時擅编,view也會被釋放攀细,weakLabel同樣。

  • weak類型的控件:UIViewController->UIView->subView->UILabel
    @property (weak, nonatomic) UILabel *weakLabel2;
    其實就是IB的代碼編寫的實現(xiàn)爱态,內(nèi)存管理方式是一樣的

  • strong類型的控件:
    UIViewController->UIView->subView->UILabel
    UIViewController->UILabel
    @property (strong, nonatomic) UILabel *strongLabel;
    因此當(dāng)strongLabel在view移除后谭贪,controller還對其進行保持

0x3.weak與strong場景使用

- 場景1:IB中多狀態(tài)UI布局方式(所以IB還是個好東西,可視化程度高锦担,節(jié)省很多時間)

//@property (strong, nonatomic) IBOutlet UIView *statusView1;
//@property (strong, nonatomic) IBOutlet UIView *statusView2;
@property (weak, nonatomic) IBOutlet UIView *statusView1;
@property (weak, nonatomic) IBOutlet UIView *statusView2;

這里就會出現(xiàn)兩種情況:
一是主容器view里面的label可以直接為weak俭识,其它兩個view也為weak
當(dāng)狀況view1、2初始化完成后洞渔,在viewDidLoad方法里面沒有add到self.view中套媚,當(dāng)數(shù)據(jù)load回來要更新狀態(tài)時,會發(fā)現(xiàn)view1磁椒、2已經(jīng)為nil了
二是其它兩個view為strong
這種情況就很明了堤瘤,跟代碼strong是一個道理,跟隨控制器生命周期

t4.png

- 場景2:weak與strong代碼布局使用
1.懶加載浆熔,使用strong本辐。
為什么不使用weak,getter實現(xiàn)的時候医增,對象不持有慎皱。

@property (strong, nonatomic) UILabel *strongLabel;
  -(UILabel*)strongLabel{
    if(!_strongLabel){
        _strongLabel = [[UILabel alloc]init];
        _strongLabel.text = @"strongLabel";
        _strongLabel.frame = CGRectMake(50, 100, 100, 21);
    }
    return _strongLabel;
}

2.weak定義
@property (weak, nonatomic) UILabel *weakLabel2;
注: 如果labTemp沒有addSubview到self.view中,_weakLabel2將在viewDidLoad執(zhí)行完后釋放

 UILabel *labTemp = [[UILabel alloc]init];
 labTemp.frame = CGRectMake(50, 60, 100, 21);
 labTemp.text = @"weakLabel2";
 self.weakLabel2 = labTemp;
 [self.view addSubview:labTemp];

最后

引用知乎的一句話 余暢
因為控件他爹( view.superview )已經(jīng)揪著它的小辮了( strong reference )叶骨,你( viewController )眼瞅著( weak reference )就好了宝冕。
當(dāng)然,如果你想在 view 從 superview 里面 remove 掉之后還繼續(xù)持有的話邓萨,還是要用 strong 的( 你也揪著它的小辮, 這樣如果他爹松手了它也跑不了 )菊卷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缔恳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子洁闰,更是在濱河造成了極大的恐慌歉甚,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扑眉,死亡現(xiàn)場離奇詭異纸泄,居然都是意外死亡赖钞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門聘裁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雪营,“玉大人,你說我怎么就攤上這事衡便∠灼穑” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵镣陕,是天一觀的道長谴餐。 經(jīng)常有香客問我,道長呆抑,這世上最難降的妖魔是什么岂嗓? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鹊碍,結(jié)果婚禮上厌殉,老公的妹妹穿的比我還像新娘。我一直安慰自己妹萨,他們只是感情好年枕,可當(dāng)我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著乎完,像睡著了一般熏兄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上树姨,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天摩桶,我揣著相機與錄音,去河邊找鬼帽揪。 笑死硝清,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的转晰。 我是一名探鬼主播芦拿,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼查邢!你這毒婦竟也來了蔗崎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤扰藕,失蹤者是張志新(化名)和其女友劉穎缓苛,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邓深,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡未桥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年笔刹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冬耿。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡舌菜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淆党,到底是詐尸還是另有隱情酷师,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布染乌,位于F島的核電站山孔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏荷憋。R本人自食惡果不足惜台颠,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望勒庄。 院中可真熱鬧串前,春花似錦、人聲如沸实蔽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽局装。三九已至坛吁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間铐尚,已是汗流浹背拨脉。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留宣增,地道東北人玫膀。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像爹脾,于是被迫代替她去往敵國和親帖旨。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容