代码块(Block)
(1)主要作用:将一段代码保存起来,在需要的地方调用即可。
(2)全局变量在代码块中的使用:
全局变量可以在代码块中使用,同时也可以被改变,代码片段如下:
1 int local = 1;//注意:全局变量2 void (^block0)(void) = ^(void){3 local ++;4 NSLog(@"local = %d",local);5 }; 6 block0();7 NSLog(@"外部 local = %d",local);
结果为:local = 2;
外部 local = 2;
(3)局部变量在代码块中的使用:
**一般的局部变量只能在代码块中使用,但不能被改变(此时无法通过编译),代码片段如下:
1 int n = 1000;//局部变量2 void (^block1)(void) = ^(void){3 // n++;4 NSLog(@"float1 = %d",n);5 };6 block1();7 NSLog(@"float2 = %d",n);
结果为:float1 = 1000
float2 = 1000
**将局部变量声明为__block时,不仅可以在代码块中使用,同时也可以被改变。代码片段如下:
1 __block int j = 200;//声明为__block变量2 void (^block2)(void) = ^(void){3 j++;4 NSLog(@"块变量 = %d",j);5 };6 block2();7 NSLog(@"快变量2 = %d",j);
结果为:块变量 = 201
快变量2 = 201
(4)代码块作为方法参数使用:
自定义类:
首先BlockClasss.h类:
1 #import2 3 @interface BlockClasss : NSObject 4 5 //声明int型变量 6 @property (nonatomic,assign)int result; 7 @property (nonatomic,assign)int result2; 8 9 - (int)result:(int (^)(int))block;10 11 - (BlockClasss *(^)(int value))add;12 @end
然后BlockClasss.m的实现:
1 #import "BlockClasss.h" 2 3 @implementation BlockClasss 4 - (int)result:(int (^)(int))block{ 5 _result = block(_result); 6 return _result; 7 } 8 9 - (BlockClasss *(^)(int))add{10 return ^BlockClasss *(int value){11 _result2 += value;12 return self;13 };14 }15 @end
代码块作为方法参数的使用代码:
1 BlockClasss *bl = [[BlockClasss alloc]init];2 [bl result:^int(int result) {3 result += 10;4 result *= 2;5 return result;6 }];7 NSLog(@"result = %d",bl.result);
结果为:result = 20
(5)代码块作为方法返回值使用:
1 BlockClasss *bl2 = [[BlockClasss alloc]init];2 bl2.add(100).add(200);3 NSLog(@"结果 ^=%d",bl2.result2);
打印结果为:结果 ^=300
(6)避免循环引用:
在代码块中不能使用self或者_XXX,以免发生循环引用。最好是将self在外部定义为__weak属性,然后再去使用。
例如:
1 __weak self weakSelf = self;2 _block = ^{3 NSLog(weakSelf.result);4 };
posted on 2016-11-20 22:54 阅读( ...) 评论( ...)