OC語言(七)Block複習

2021-06-28 18:30:56 字數 1377 閱讀 9990

看下面一道block的面試題:

int i = 10;

void(^myblock)() = ^;

i = 100;

myblock();

經過這個過程後,輸出的i應該是10而不是100,在定義block時會將block前面的區域性變數進行拷貝,後續的變數改變不會影響block內部的拷貝變數值,如果要操作block中變數的值,應該加上__block關鍵字。

另外一道:

tip:如果在block中使用了self,block會對self強引用。

@property (nonatomic, strong) nsmutablearray *myblocks;

int(^sum)(int,int) = ^(int x, int y)

[self.myblocks addobject:sum];

注意到self對myblocks是強引用,如果把sum加入到myblocks陣列中,myblocks陣列又會有強指標指向sum,由於sum這個block需要呼叫self的方法,因此sum對self是強引用,因此構成了迴圈引用,無法釋放。

第三道:

如果self物件持有操作物件(例如類直接有block),而操作物件(如block)又直接訪問了self,則block會對self構成強引用,self又對block強引用,會造成迴圈引用。

單純在操作物件(如block)中操作self不會造成迴圈引用。

例如使用執行緒建立block,由於非主線程預設沒有訊息迴圈(run loop),因此執行緒銷毀時block也會銷毀,block為執行緒所有,不是self所有,不會造成迴圈引用。

@inte***ce demoobj ()

@property (nonatomic, strong) nsoperationqueue *queue;

@end

@implementation demoobj

- (instancetype)init

return self;

}- (void)dealloc

- (void)demoop:(id)obj

- (void)demoblockop];

}

這種情況下,self對queue強引用,queue對block強引用,雖然block對self也有強引用,但是執行緒消失時block會銷毀,也就不存在引用環了,因此self只有直接擁有block時才會造成迴圈引用。

tip:在這種情況下,不能使用self的弱引用(__weak demoobj *weakself = self),這樣物件會在建立時的強指標銷毀時被銷毀,也就是說block指向的self類不能保證其存在,故block會無法呼叫self,注意不能使用弱引用!!!

OC語言BLOCK和協議

oc語言 block 和協議一 bolck 一 簡介 block是什麼?蘋果推薦的型別,效率高,在執行中儲存 用來封裝和儲存 有點像函式,block 可以在任何時候執行。bolck和函式的相似性 1 可以儲存 2 有返回值 3 有形參 4 呼叫方式一樣。識別符號 二 基本使用 1 定義block變數...

OC語言中的block

block封裝了一段 可以在任何時候執行 block可以作為函式引數或者函式的返回值,而其本身又可以帶輸入引數或返回值。蘋果官方建議盡量多用block。在多執行緒 非同步任務 集合遍歷 集合排序 動畫轉場用的很多 blocks的定義 int mysum int,int int a,int b 定義了...

OC語言BLOCK和協議

oc語言 block 和協議一 bolck 一 簡介 block是什麼?蘋果推薦的型別,效率高,在執行中儲存 用來封裝和儲存 有點像函式,block 可以在任何時候執行。bolck和函式的相似性 1 可以儲存 2 有返回值 3 有形參 4 呼叫方式一樣。識別符號 二 基本使用 1 定義block 變...