Objective C中block迴圈引用問題詳解

2022-09-20 20:54:08 字數 864 閱讀 5012

目標:block執行過程中,self不會釋放;執行完可以釋放。

最初block中直接使用self會強引用。

self.myblock = ^() ;

或者使用了物件的屬性

self.myblock = ^()程式設計客棧 ;

在這樣的情況下,self強引用block,block也持有該物件,導致迴圈引用。

要注意的是,只有在self強引用block的時候才會有這樣的問題。一般使用gcd或nsoperation時使用的內聯block是不會出現迴圈引用的。

加入weak self

__weak __typeof(self) weakself = self;

self.myblock = ^() ;vbfvis

這樣,self持有了block,但block對self是弱引用,就不會導致迴圈引用了。

而在[weakself dosomething]過程中,self是不會釋放的,完美。

但是,如果是這樣呢?

__weak __typeof(self) weakself = self;

self.myblock = ^() ;

在[weakself dosomething]和[weakself dosomething2]之間,self可能會被釋放掉。這可程式設計客棧能會導致奇怪的問題。

加入strong self

__weak __typeof(self) weakself = self;

self.myblock = ^() ;

這樣,block既沒有持有self,又能保證block在執行過程中self不被釋放,真正達到了最初的目標。

總結本文標題: objective-c中block迴圈引用問題詳解

本文位址:

objc msgSend呼叫引數是block的函式

有乙個函式的引數是block 例 void delete nsstring value result callbackblcok callback 正常的呼叫就是如下 x sharedinstance delete value result int number 複製 突然想到如果都用runtime...

objective c中命名規範

一 關於objective c中類的命名規範 1 類名 及其 category name 和 protocal name 的首字母大寫,寫使用首字母大寫的形式 分割單詞。駝峰標示 2 在面向特定應用的 中,類名應盡量避免使用字首,每個類都使用相同的字首影響可讀性。3 在面向多應用的 中,推薦使用字首...

Objective C中的快取

nscache可以設定數量限制,通過countlimit與 totalcostlimit來限制cache的數量或者限制cost。當快取的數量超過countlimit,或者cost之和超過totalcostlimit,nscache會自動釋放部分快取。例子如下 可以看到,cache中只保留了最新的30...