=========================test 1===========================
float (^block1)(float, float) = ^(float a, float b){ return a + b; };
NSLog(@"====test 1 >> block1 is %@", block1);
NSArray *testArr = @[@"1", @"2"];
NSLog(@"====test 1 >> block2 is %@", ^{ NSLog(@"testArr :%@", testArr[1]); });
void (^block3)(void) = ^{ NSLog(@"testArr :%@", testArr[1]); };
NSLog(@"====test 1 >> block3 is %@", block3);
在ARC中打印:
2018-02-02 10:49:09.316 BlockDemo[859:360563] ====test 1 >> block1 is <__NSGlobalBlock__: 0x1000e00b8>
2018-02-02 10:49:09.317 BlockDemo[859:360563] ====test 1 >> block2 is <__NSStackBlock__: 0x16fd25ef0>
2018-02-02 10:49:09.317 BlockDemo[859:360563] ====test 1 >> block3 is <__NSMallocBlock__: 0x15e643e10>
在MRC中打印:
2018-02-02 11:16:58.335 BlockDemo[862:363874] ====test 1 >> block1 is <__NSGlobalBlock__: 0x1000700a0>
2018-02-02 11:16:58.335 BlockDemo[862:363874] ====test 1 >> block2 is <__NSStackBlock__: 0x16fd95ef0>
2018-02-02 11:16:58.335 BlockDemo[862:363874] ====test 1 >> block3 is <__NSStackBlock__: 0x16fd95ec0>
总结:
/*在ARC中:
*1.block1没有访问外部变量,block1在NSGlobalBlock
*2.block2访问了外部变量,block2在NSStackBlock
*3.block3访问了外部变量,且有赋值操作。block3在NSMallocBlock,因为在ARC中默认是__strong修饰,系统把栈中的block 自动copy到堆中。
*在MRC中:
*1.block1没有访问外部变量,block1在NSGlobalBlock
*2.block2访问了外部变量,block2在NSStackBlock
*3.block3访问了外部变量,且有赋值操作。但block3在NSStackBlock。因为MRC自动管理内存,系统没有做自动copy操作。
*/
=========================test 2===========================
int c = 100;
int(^block1)(int a, int b) = ^int(int a, int b){ return c+a+b; };
NSLog(@"====test 2 >> block1 = %@",block1);
__weak int(^block2)(int a, int b) = ^int(int a, int b){ return c+a+b; };
NSLog(@"====test 2 >> block2 = %@",block2);
__weak int(^block3)(int a, int b) = block2;
NSLog(@"====test 2 >> block3 = %@",block3);
在ARC中打印:
2018-02-02 11:28:53.075 BlockDemo[865:365509] ====test 2 >> block1 = <__NSMallocBlock__: 0x126659d80>
2018-02-02 11:28:53.075 BlockDemo[865:365509] ====test 2 >> block2 = <__NSStackBlock__: 0x16fd95ec8>
2018-02-02 11:28:53.075 BlockDemo[865:365509] ====test 2 >> block3 = <__NSStackBlock__: 0x16fd95ec8>
在MRC中打印:
因为mrc中没有__weak,所以block2、block3会编译报错,block1在NSStackBlock中。
=========================test 3===========================
NSLog(@"====test 3 >> block1 = %@",[self getMyGlobalBlock]);
myBlock block2= [self getMyGlobalBlock];
NSLog(@"====test 3 >> block2 = %@",block2);
NSLog(@"====test 3 >> block3 = %@",[self getMyMallocBlock]);
myBlock block4= [self getMyMallocBlock];
NSLog(@"====test 3 >> block4 = %@",block4);
NSArray *arr = [self getGlobalBlockArray];
NSLog(@"====test 3 >> block5 = %@",arr[0]);
myBlock blk0 = (myBlock)arr[0];
NSLog(@"====test 3 >> block6 = %@",blk0);
NSLog(@"====test 3 >> block7 = %@",(myBlock)arr[1]);
myBlock blk1 = (myBlock)arr[1];
NSLog(@"====test 3 >> block8 = %@",blk1);
NSArray *arr1 = [self getMallocBlockArray];
NSLog(@"====test 3 >> block55 = %@",arr1[0]);
myBlock blk00 = (myBlock)arr1[0];
NSLog(@"====test 3 >> block66 = %@",blk00);
NSLog(@"====test 3 >> block77 = %@",(myBlock)arr1[1]);
myBlock blk11 = (myBlock)arr1[1];
NSLog(@"====test 3 >> block88 = %@",blk11);
-(myBlock)getMyGlobalBlock
{
return ^{printf("add=%d\n",0);};
}
-(myBlock)getMyMallocBlock
{
int add=10;
return ^{printf("add=%d\n",add);};
}
-(id) getGlobalBlockArray
{
return [NSArray arrayWithObjects:
^{NSLog(@"blk0:%d",1);},
^{NSLog(@"blk1:%d",2);},nil];
}
-(id) getMallocBlockArray
{
int a =10, b = 100;
return [NSArray arrayWithObjects:
^{NSLog(@"blk0:%d",a);},
^{NSLog(@"blk1:%d",b);},nil];
}
在ARC中打印:
2018-02-02 14:51:20.594 BlockDemo[921:395069] ====test 3 >> block1 = <__NSGlobalBlock__: 0x1000ac0a0>
2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block2 = <__NSGlobalBlock__: 0x1000ac0a0>
2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block3 = <__NSMallocBlock__: 0x154e63930>
2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block4 = <__NSMallocBlock__: 0x154e63930>
2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block5 = <__NSGlobalBlock__: 0x1000ac100>
2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block6 = <__NSGlobalBlock__: 0x1000ac100>
2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block7 = <__NSGlobalBlock__: 0x1000ac140>
2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block8 = <__NSGlobalBlock__: 0x1000ac140>
2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block55 = <__NSMallocBlock__: 0x154e5e760>
2018-02-02 14:51:20.595 BlockDemo[921:395069] ====test 3 >> block66 = <__NSMallocBlock__: 0x154e5e760>
(lldb)
在MRC中打印:
2018-02-02 14:56:06.188 BlockDemo[924:396265] ====test 3 >> block1 = <__NSGlobalBlock__: 0x10005c080>
2018-02-02 14:56:06.188 BlockDemo[924:396265] ====test 3 >> block2 = <__NSGlobalBlock__: 0x10005c080>
2018-02-02 14:56:06.188 BlockDemo[924:396265] ====test 3 >> block5 = <__NSGlobalBlock__: 0x10005c0c0>
2018-02-02 14:56:06.188 BlockDemo[924:396265] ====test 3 >> block6 = <__NSGlobalBlock__: 0x10005c0c0>
2018-02-02 14:56:06.188 BlockDemo[924:396265] ====test 3 >> block7 = <__NSGlobalBlock__: 0x10005c100>
2018-02-02 14:56:06.189 BlockDemo[924:396265] ====test 3 >> block8 = <__NSGlobalBlock__: 0x10005c100>
(lldb)
总结:
/*在ARC中:
*1.return在栈中的block,无论是否有赋值操作,最终获得block都存在堆中。
*2.return在全局区的block,无论是否有赋值操作,最终获得block都全局区。
*3.return数组,数组中如果是全局区的block,最终获得block都全局区。
*4.return数组,数组中如果是栈中的block,arr[0]保存block在堆中,arr[1]会报错。
*在MRC中:
*1.return在栈中的block,编译报错,提示无法返回本地block。
*2.return在全局区的block,无论是否有赋值操作,最终获得block都全局区。
*3.return数组,数组中如果是全局区的block,最终获得block都全局区。
*4.return数组,数组中如果是栈中的block,打印block会报错。
*/
=========================test 4===========================
NSString *str = @"test";
NSLog(@"====test 4 >> 0: %@",^{ NSLog(@"%@", str); });
myBlock block1 = [self test4];
NSLog(@"====test 4 >> 1: %@",block1);
NSLog(@"====test 4 >> 2: %@",[self test4]);
- (myBlock)test4
{
char e = 'E';
void (^block)() = ^{ NSLog(@"========:%c", e); };
return block;
}
在ARC中打印:
2018-02-02 15:20:24.721 BlockDemo[938:400472] ====test 4 >> 0: <__NSStackBlock__: 0x16fd6df10>
2018-02-02 15:20:24.721 BlockDemo[938:400472] ====test 4 >> 1: <__NSMallocBlock__: 0x155515240>
2018-02-02 15:20:24.721 BlockDemo[938:400472] ====test 4 >> 2: <__NSMallocBlock__: 0x155567360>
在MRC中打印:
2018-02-02 15:25:21.431 BlockDemo[941:401388] ====test 4 >> 0: <__NSStackBlock__: 0x16fd85f10>
(lldb)
总结:
/*在MRC中:
*return已经赋值的栈中block,编译可以通过,调用会报错。
*/
扩展
/*在现在Blocks中,没有实现对C语言数组的截取(ARC和Mrc中编译没法通过),使用指针可以解决问题*/
char *text = "Hello";
myBlock block1 = ^{ printf("test 5 >> 0:%c\n",text[0]); };
block1();
char text1[] = "Hello";
myBlock block2 = ^{ printf("test 5 >> 1:%c\n",text1[0]); }; //编译报错