(二)block、delegate修飾詞

一、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)引用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容