iOS開發--@property屬性的使用

1、strong和weak

strong:強指針/強引用;默認情況下,任何指針都是強指針 ;也就是說,我們平常定義的時候Person *p =[ [Person alloc] init];都是strong;
weak:弱指針/弱引用;使用_weak修飾的指針。

ARC(自動引用計數)的判斷準則:只要沒有任何強指針指向,這個對象就會被銷燬;
當然超過自己的作用範圍也會被銷燬;

但是程序執行完,仍然有強指針指向(你的strong屬性指向我,我的strong屬性指向你),就會造成內存泄露

@autoreleasepool{
	// 一開始就是弱指針指向 ,這一行代碼過掉,p對象就會被銷燬(調用dealloc方法)
	_weak Person *p = [Person alloc] init]; 
}

@autoreleasepool{
	  Person *p = [Person alloc] init]; 
	  Dog *d = [Dog alloc] init];
	  p.dog = d;
	  d = nil; // 相當於把指向堆內存中的d對象的那根指針去掉
	  NSLog(@"%@"p.dog); // 還是能打印出來的,因爲p中的dog屬性是強指針
} 
普通對象做屬性使用strong:這樣保證了,當前對象p在,p的dog屬性指向對象也在

2、UI對象爲什麼使用weak?

對於UI對象,weak和strong都可以,但是沒必要用strong。
在UIViewController中的view屬性是個強指針:@property(nonatomic,retain) UIView *view; (iOS5之前retain就是strong)
在view中又有一個subViews數組,數組是個強指針,0的位置存放的強指針指向的是UIButton ;
所以Vc在--view就在--subViews就在--0位置存放的強指針就在,指向的UIButton對象就在,所以沒有UI控件沒必要定義strong
iOS5之前的assign就是weak

3、delegate爲什麼用weak?

Vc中view屬性是strong,指向view;如果view中delegate是strong,一般指向Vc;兩根都是strong就會出問題(內存泄露),所以delegate必須是weak

4、這張圖片很好的解釋了上述問題:


比如delegate爲什麼使用weak?

如果delegate使用strong,當程序退出,UIWindow對象銷燬之後,UITableViewController對象也要被銷燬,

但是由於被delegate是strong並且指向了Vc,所以Vc不會被銷燬,造成內存泄露。

5、@property屬性的使用

weak(assign):代理\UI控件
strong(retain):普通對象
copy:字符串
assign:基本數據類型









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章