最近和朋友閑聊說到這個(gè)delegate屬性都是assign而不是retain的,現(xiàn)將這幾個(gè)整理區(qū)分下:
1、oc的所有、懶加載 用strong 指所有NS
@property (nonatomic, strong) NSIndexPath *indexPath;
@property (nonatomic, strong) NSMutableArray *arr_props;
2、UI控件的用weak,
但如果是使用了懶加載的話(看什么時(shí)候添加到父控件上 和 父控件是不是有強(qiáng)指針指向) 用 strong
@property (nonatomic, weak) UILabel *label;
3、字符串,block塊用copy
@property (nonatomic, copy) NSString *title;
4、結(jié)構(gòu)體,枚舉,基本數(shù)據(jù)類型用assign (delegate代理用assign不用retain)
@property (nonatomic, assign) NSInteger currentPageIndex;
CGFloat CGRect BOOL。。。
5、控制器的話用weak時(shí)需要將自己添加子控制器
[self addChildViewController:m_tableView];
用strong時(shí)需要delloc
問:為什么很多內(nèi)置類如UITableViewController的delegate屬性都是assign而不是retain的?
答:會(huì)引起循環(huán)引用。
這里delegate我們只是想得到實(shí)現(xiàn)了它delegate方法的對(duì)象,然后拿到這個(gè)對(duì)象的指針就可以了,我們不期望去改變它或者做別的什么操作,所以我們只要用assign拿到它的指針就可以了。
而用retain的話,計(jì)數(shù)器加1。我們有可能在別的地方期望釋放掉delegate這個(gè)對(duì)象,然后通過一些判斷比如說它是否已經(jīng)被釋放,做一些操作。但是實(shí)際上它retainCount還是1,沒有被釋放掉,要在UITableViewController的dealloc里面才被釋放掉(這里我只是舉個(gè)例子,一般retain的對(duì)象都是在dealloc里被釋放)。這里就會(huì)造成一些問題出現(xiàn)。
而如果你確定不會(huì)有沖突的問題出現(xiàn)的話,或者你也希望用到delegate的這個(gè)對(duì)象,直到你不用它為止,那么用retain也未嘗不可,只是需要最后release一次。