相信很多人都知道撵割,從IB中拖出來的outlet 默認是weak的 那么純代碼搭建view時 是應該怎樣聲明view對象呢改抡?
首先我們先嘗試將代碼中的view 屬性設置成weak實現(xiàn)一下诗舰,看一下效果怎么樣
@property (nonatomic,weak) UILabel *label;
將label聲明成weak后在viewDidLoad中初始化label
self.label = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
self.label.text = @"hello my world!!";
[self.view addSubview:self.label];
這時候編譯器會給我們報一個警告
再嘗試運行一下梨州,果然屏幕上什么也沒有非剃。
那我們再用strong嘗試一下寥殖,看一下效果如何呢?
將weak更為strong
@property (nonatomic,strong) UILabel *label;
然后警告沒有了
出現(xiàn)了我們添加的label
那是不是我們應該用strong 而不是用label呢呛牲?我們來看看三者之間的關(guān)系
三者之間的關(guān)系 viewController --> viewController.view --> view.subview (UIView)
我們看到刮萌,其實label的所有者其實是self.view,那么在viewcontroller中聲明labelweak應該是正確的娘扩,如果聲明為strong 那么在label從self.view中移除時着茸,label將不會被釋放壮锻。造成view的冗余,那么為什么聲明成weak的時候,label又沒有出現(xiàn)呢涮阔?
如果聲明成weak 過程是這樣的:
//我們聲明了label
self.label = [UILabel alloc] initWithFrame:CGRectMake(50,50,100,100);
//其實是這樣一個過程
id temp = [UILabel alloc] initWithFrame:CGRectMake(50,50,100,100);//temp此時引用計數(shù)為1
[self setLabel:temp];//此時引用計數(shù)仍為1
[temp release];//此時temp已經(jīng)沒有強引用 計數(shù)清0
//然后我們將label添加到view中去
[self.view addSubview:self.label];//其實是添加的一個nil對象猜绣,當然屏幕上沒有顯示,那么應該怎樣聲明才是正確的呢?
我們剛剛說了strong肯定是不合適的敬特,但是能夠達到我們的想要的效果掰邢,但是一旦view增多,造成的內(nèi)存泄露越來越嚴重伟阔,這個是我們不想要看到的辣之。
正確的操作方式
UILabel *tempLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
self.label = tempLabel;
self.label.text = @"hello my world!!";
[self.view addSubview:self.label];
這樣在我們的屏幕上就會出現(xiàn)label了
這段話的執(zhí)行過程是:
UILabel *tempLabel = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
//執(zhí)行過程
// id temp = [[UILabel alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];//temp計數(shù)1
// UILabel *tempLabel = temp;//temp 計數(shù)為2
self.label = tempLabel;//label的屬性為weak 引用計數(shù)不增加 依然為2
[self.view addSubview:self.label];//temp的引用計數(shù)加1 為3
//此時 tempLabel 沒有了引用 release掉
[tempLabel release]; //temp引用計數(shù)為2
//temp release掉
[temp release]; //temp引用計數(shù)為1
所以這樣 我們的label依然還是沒有被釋放掉的
這樣的初始化方法 是比較科學的 如有不當之處 敬請指出 我們一起學習成長!
本篇文章有參考
http://stackoverflow.com/questions/9747015/why-is-addsubview-not-retaining-the-view