iOS中block

block语法结构

返回值类型(^block变量名)(形参列表) = ^(形参列表) {

};

NSString* (^logBlock)(NSString *,NSString *) = ^(NSString * str1,NSString *str2){

return [NSString stringWithFormat:@"%@%@",str1,str2];

};

//调用logBlock,输出的是 我是Block

NSLog(@"%@", logBlock(@"我是",@"Block"));

block的强大之处:在声明它的范围里,所有变量都可以为其所捕获。

默认情况下,为块所捕获的变量,是不可以在块里修改的

- (void)viewDidLoad

{

//将Block定义在方法内部

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

结构:

typedef 返回值类型 (^newBlockTypeName)(参数列表);

//定义一个有参有返回值的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需要再加一个参数,你只需要更改typedef即可。

typedef void(^XJ_CompletionHandler) (NSData *data, NSError *error);

- (void)startWithCompletionHandler:(XJ_CompletionHandler)completion;

block的循环引用问题

即使在你的block代码中没有显式地出现"self",也会出现循环引用!只要你在block里用到了self所拥有的东西。

__weak typeof(self) weakSelf = self;

self.blockA = ^{

__strong typeof(weakSelf) strongSelf = weakSelf;//加一下强引用,避免weakSelf被释放掉

NSLog(@"%@", strongSelf->_xxView); //不会导致循环引用.

};

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容