一、Block
1、使用copy
因為block屬于代碼塊,存放在棧區(qū),釋放是由編譯器決定的,如果不對block進(jìn)行copy操作,之后使用的時候很可能block已經(jīng)釋放。所以出于安全考慮,需要先將block copy到堆區(qū)。在ARC模式中,系統(tǒng)自動對block進(jìn)行copy操作,但是MRC需要手動進(jìn)行 copy。(在ARC中用strong修飾block也是可以的,系統(tǒng)會自動進(jìn)行copy)
2、循環(huán)引用:
因為block在拷貝到堆上的時候,會retain其引用的外部變量,那么如果block中如果引用了他的宿主對象,那很有可能引起循環(huán)引用
所以為了防止循環(huán)引用引起的內(nèi)存泄漏,使用__weak。(循環(huán)引用也就是對象之間互相持有,或者形成一個retail cycle)
注:
只要 block中用到了對象的屬性或者函數(shù),(self.string,_string, [self ChangeString])block就會持有該對象而不是該對象中的某個屬性或者函數(shù)。(解釋:即對于block中調(diào)用self.string,持有的是self而不是string)
例如:
① 對self弱引用
// @property (nonatomic, copy) NSString *blockString;
__weak typeof(self) weakSelf = self;
self.myBlock = ^() {
NSString *localString = weakSelf.blockString;
};
② 對屬性弱引用
// NSString *_blockString; 在block中修改需要加修飾詞__block
__block __weak typeof(_blockString) weakBlockStr = _blockString;
self.myBlock = ^() {
weakBlockStr = @“weakBlockStr”;
};
3、參考資料:
iOS內(nèi)存管理(4)--Block屬性用copy修飾 & 避免循環(huán)引用的問題
小結(jié)iOS中的copy
二、Delegate
1、使用weak/assign
使用弱引用是為了防止循環(huán)引用
ARC中使用weak,釋放之后會自動置空;
MRC中使用assign,但是需要手動置空,即delegate = nil;
如果使用強(qiáng)引用:
viewcontroller-->tableview-->tableview.Delegate-->viewcontroller 這樣會造成循環(huán)引用。