神一样的存在
- Block 为什么使用copy
- Block在创建的时候默认分配的内存在栈上,而不是在堆上。使用copy将其拷贝到堆上,防止在创建的作用域之外使用崩溃。
- Block 创建在栈上,而Block的代码中可能会用到本地的一些变量,只有将其拷贝到堆上才能使用这些变量。
- Block 为什么不适用retain
retain使用引用计数增加1,Block的内存在栈上,不是堆上,可能随时被系统回收,导致野指针存在,程序崩溃。 - 为什么Block中的对象引用计数需要自动加1
Block执行的是回调,因此Block并不知道其中的对象obj创建后会在什么时候释放,为了不再Block使用object之前,对象已经释放,Block就retain了object一次,持有这个对象。 - Block和函数的关系
- Block的理解
Block实际上是:指向结构体的指针 - 对于基本数据
//如果需要在block中对num进行修改,需要加上关键字__block
//(我们也可以用static关键字进行修饰)
int num1 = 10;
void(^block1)() = ^{
NSLog(@"num1 is %d",num1);
};
num1 = 20;
block1();//输出10
//改进:使用block,使进入到block块中的变量不被当做常量来使用
__blockint num2 = 10;
void(^block2)() = ^{
NSLog(@"num2 is %d",num2);
};
num2 = 20;
block2();//输出20