首先,什么是block:block其实就是一个代码块,把你想要执行的代码封装在这个代码块里,等到须要的时候再去调用。那block是OC对象吗?答案是确定的程序员
作一道很简单的关于block的测试题。:面试
1 // 2 int (^testBlock) (int) = ^(int num) { 3 return num++; 4 }; 5 NSLog(@"%d", testBlock(testBlock(testBlock(3))));
这道题是我公司面试题中的一道,来面试的都是至少两年工做经验的,可是很郁闷,这道题绝大多数人写的都是6。。正确结果为:3。app
如下讲解的内容均是ARC环境下。函数
//栈block int i = 0; NSLog(@"%@",^{NSLog(@"%d",i);});//输出结果 __NSStackBlock__: 0x7fff57aada78>
//堆block int j = 0; void(^mallocBlock)() = ^ { NSLog(@"%d",j); }; NSLog(@"%@",mallocBlock);//输出结果 <__NSMallocBlock__: 0x7f8cd351db80>
//全局block void (^globalBlock) () = ^ { NSLog(@"%d",staticNum); }; NSLog(@"%@",globalBlock); //输出结果 <__NSGlobalBlock__: 0x108152110>
注意:若是block中没有用到外界变量,无论他是用什么修饰符修饰,他都是全局block!测试
例如:spa
void (^global2Block) () = ^ { NSLog(@"globalBlock"); }; NSLog(@"%@",global2Block); // 输出结果 <__NSGlobalBlock__: 0x1023a0150>
2、block对外界变量的捕获指针
1.1 基本数据类型:局部变量code
block会拷贝该变量的值当作常量使用,外界修改变量的值不会影响block内部,且block内部不能对其修改xml
block内部修改外界变量i的值直接报错,若是想要修改,能够在int a = 0前面加上关键字__block,此时i等效于全局变量或静态变量对象
int a = 0; void (^block1)() = ^ { // a++ 直接修改a会报错 NSLog(@"a = %d",a); }; a++; block1(); //输出结果 a = 0; __block int b = 0; void (^block2) () = ^ { NSLog(@"b = %d",b); // 输出结果 b = 0; b = 2; }; block2(); NSLog(@"b = %d",b); //输出结果 b = 2;
1.2 基本数据类型:成员变量(实例变量),静态变量,全局变量
block直接访问变量地址,在block内部能够修改变量的值,而且外部变量被修改后,block内部也会跟着变
self.num = 1; self.num ++; void (^block3) () = ^ { self.num++; }; block3(); NSLog(@"%d",self.num);//输出结果为 3
2.1 指针类型: 局部变量
block会复制一份指针并强引用指针所指对象,且内部不能修改指针的指向,可是能够修改指针所指向对象的值
NSMutableString *str = @"abc".mutableCopy; void (^block4) () = ^ { // str = @"def"; 报错 [str appendString:@"def"]; NSLog(@"str = %@",str); }; str = @"123".mutableCopy; block4(); //输出结果为 "adbdef"
2.2 指针类型: 成员变量(实例变量),静态变量,全局变量
block不会复制指针,可是会强引用该对象,内部可修改指针指向,block会强引用成员属性\变量所属的对象,这也是为何block内部用到self.xxx或_xxx可能会引发循环引用的缘由
static NSString *staticStr = @"abc"; void (^block5) () = ^ { NSLog(@"staticStr = %@",staticStr); staticStr = @"def"; NSLog(@"staticStr = %@",staticStr); }; staticStr = @"123"; block5(); //输出结果为 staticStr = 123 staticStr = def