看下面一道block的面試題:
int i = 10;
void(^myblock)() = ^;
i = 100;
myblock();
經過這個過程後,輸出的i應該是10而不是100,在定義block時會將block前面的區域性變數進行拷貝,後續的變數改變不會影響block內部的拷貝變數值,如果要操作block中變數的值,應該加上__block關鍵字。
另外一道:
tip:如果在block中使用了self,block會對self強引用。
注意到self對myblocks是強引用,如果把sum加入到myblocks陣列中,myblocks陣列又會有強指標指向sum,由於sum這個block需要呼叫self的方法,因此sum對self是強引用,因此構成了迴圈引用,無法釋放。@property (nonatomic, strong) nsmutablearray *myblocks;
int(^sum)(int,int) = ^(int x, int y)
[self.myblocks addobject:sum];
第三道:
如果self物件持有操作物件(例如類直接有block),而操作物件(如block)又直接訪問了self,則block會對self構成強引用,self又對block強引用,會造成迴圈引用。
單純在操作物件(如block)中操作self不會造成迴圈引用。
例如使用執行緒建立block,由於非主線程預設沒有訊息迴圈(run loop),因此執行緒銷毀時block也會銷毀,block為執行緒所有,不是self所有,不會造成迴圈引用。
這種情況下,self對queue強引用,queue對block強引用,雖然block對self也有強引用,但是執行緒消失時block會銷毀,也就不存在引用環了,因此self只有直接擁有block時才會造成迴圈引用。@inte***ce demoobj ()
@property (nonatomic, strong) nsoperationqueue *queue;
@end
@implementation demoobj
- (instancetype)init
return self;
}- (void)dealloc
- (void)demoop:(id)obj
- (void)demoblockop];
}
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 變...