^是Block的特有标記
Block的實作代碼包含在{}之間
大多情況下,以内聯inline函數的方式被定義和使用
系統中有自帶的inlineblock, Xcode裡直接敲就會出現block
例如:
void(^demoBlock)() = ^ {
NSLog(@"demo Block");
};
int(^sumBlock)(int, int) = ^(int x, int y) {
return x + y;
};
格式說明:
(傳回類型)(^塊名稱)(參數類型) = ^(參數清單) {代碼實作};
如果沒有參數,等号後面參數清單的()可以省略
在定義Block時,會在Block中建立目前局部變量内容的副本(拷貝)
後續再對該變量的數值進行修改,不會影響Block中的數值
如果需要在block中保持局部變量的數值變化,需要使用__block關鍵字
使用__block關鍵字後,同樣可以在Block中修改該變量的數值
在被當做參數傳遞時,Block同樣可以使用在定義之前聲明的局部變量
預設情況下,Block外部的變量,在Block中是隻讀的!
如果要修改Block之外的局部變量,需要使用__block關鍵字
使用時,避免block對指針做強引用,進而引起記憶體不能釋放問題。
可以使用typedef定義一個Block的類型,便于在後續直接使用。
Block是一種資料類型,那麼可以将Block當做比較特殊的對象。
局部變量預設都是強引用的,離開其所在的作用域之後就會被釋放
使用__weak關鍵字,可以将局部變量聲明為弱引用
block 定義屬性值,使用copy
@property (nonatomic, copy) BLOCKHANDLE finishBlock;
- (void)demoBlockOp
{
// 不能用__weak
// __weak DemoObj *weakSelf = self;
// 隻有self直接強引用block,才會出現循環引用
// block的管理以及線程的建立和銷毀是由隊列負責的,直接在block中使用self沒有關系!
for (int i = 0; i < 10; ++i) {
[self.queue addOperationWithBlock:^{
//不能使用__weak
// [weakSelf demoOp:@(i)];
[self demoOp:@(i)];
}];
}
}