block語法結(jié)構(gòu):
返回值類型(^block變量名)(形參列表) = ^(形參列表) {
};
NSString *(^logBlock)(NSString *,NSString *) = ^(NSString *str1, NSString *str2){
return [NSString stringWithFormat:@"%@%@", str1, str2];
};
//調(diào)用logBlock,輸出的是 我是Block
NSLog(@"%@", logBlock(@"我是", @"Block"));
block的強大之處:在聲明它的范圍里,所有變量都可以為其所捕獲。
默認情況下,為塊所捕獲的變量副瀑,是不可以在塊里修改的
- (void)viewDidLoad {
//將Block定義在方法內(nèi)部
int x = 100;
void (^sumXAndYBlock)(int) = ^(int y){
x = x+y;
printf("new x value is %d",x);
};
sumXAndYBlock(50);
}
Xcode會提示x變量錯誤信息:Variable is not assigning (missing __block type),這時候給int x = 100;語句前面加上__block關鍵字即可:
__block int x = 100;
block的typedef
結(jié)構(gòu):
typedef 返回值類型 (^newBlockTypeName)(參數(shù)列表);
//定義一個有參有返回值的block的別名
typedef int (^myBlock)(int, int);
//此時myBlock是一個類型恋谭,不再是一個單純的變量了
myBlock b1 = ^(int a, int b){
return a + b;
};
NSLog(@"a + b = %d", b1(1,2));
另一例:
- (void)startWithCompletionHandler:(void(^)(NSData *data, NSError *error))completion糠睡;
用typedef后:好處一是易于理解,二是當block需要再加一個參數(shù)疚颊,你只需要更改typedef即可狈孔。
typedef void(^XJ_CompletionHandler) (NSData *data, NSError *error);
- (void)startWithCompletionHandler:(XJ_CompletionHandler)completion;
block的循環(huán)引用問題
即使在你的block代碼中沒有顯式地出現(xiàn)"self"材义,也會出現(xiàn)循環(huán)引用均抽!只要你在block里用到了self所擁有的東西。
__weak typeof(self) weakSelf = self;
self.blockA = ^{
__strong typeof(weakSelf) strongSelf = weakSelf;//加一下強引用其掂,避免weakSelf被釋放掉
NSLog(@"%@", strongSelf->_xxView); //不會導致循環(huán)引用.
};