如何做自己产品网站,搜外,开通网站软件的会计科目怎么做,网站建设制作细节文章目录 一、Block定义二、block为什么用copy修饰三、block使用时的注意事项四、使用 block时什么情况会发生引用循环#xff0c;如何解决#xff1f;五、在block内如何修改block外部变量#xff1f;六、__block与__weak的区别 一、Block定义
目的就是能够直接存储一个代码… 文章目录 一、Block定义二、block为什么用copy修饰三、block使用时的注意事项四、使用 block时什么情况会发生引用循环如何解决五、在block内如何修改block外部变量六、__block与__weak的区别 一、Block定义
目的就是能够直接存储一个代码块的实现部分而不需要再去定义一个函数。void (^myblock)() 可以直接跟实现的代码块就是将函数整体拿过来把函数名去掉在前面加一个block标识^。这样在别的代码块中也可以直接调用这个部分这就是oc的优化之处。 其实block就是去相当于实现代理block是委托方声明block方法并调用在代理方里面用委托方调用那个block方法并且实现。block效率更高。
二、block为什么用copy修饰
Block的内存地址显示在栈区栈区的特点就是创建的对象随时可能被销毁,一旦被销毁后续再次调用空对象就可能会造成程序崩溃,在对block进行copy后,block存放在堆区.所以在使用Block属性时使用Copy修饰,而在ARC模式下,系统也会默认对Block进行copy操作 如果是堆中的block也就是copy修饰的block。他的生命周期就是随着对象的销毁而结束的。只要对象不销毁我们就可以调用的到在堆中的block。 这就是为什么我们要用copy来修饰block。因为不用copy修饰的访问外部变量的block只在他所在的函数被调用的那一瞬间可以使用。之后就消失了。
三、block使用时的注意事项
1、在使用block前需要对block指针做判空处理。 不判空直接使用一旦指针为空直接产生崩溃。 2、在MRC的编译环境下block如果作为成员参数要copy一下将栈上的block拷贝到堆上。 3、在block使用之后要对block指针做赋空值处理如果是MRC的编译环境下要先release掉block对象。 注意 block作为类对象的成员变量使用block的人有可能用类对象参与block中的运算而产生循环引用。 将block赋值为空是解掉循环引用的重要方法。不能只在dealloc里面做赋空值操作这样已经产生的循环引用不会被破坏掉 4、使用方将self或成员变量加入block之前要先将self变为__weak 5、在多线程环境下block中的weakSelf有可能被析构的情况下需要先将self转为strong指针避免在运行到某个关键步骤时self对象被析构。
四、使用 block时什么情况会发生引用循环如何解决
一个对象中强引用了block在block中又强引用了该对象就会发生循环引用。 解决方法是将该对象使用__weak或者__block修饰符修饰之后再在block中使用。
id __weak weakSelf self; 或者 __weak __typeof(self)weakSelf self;. 该方法可以设置宏id __block weakSelf self; 或者将其中一方强制制空 xxx nil。 检测代码中是否存在循环引用问题使用Product-Profile-工程的模拟器开始运行-Leaks
五、在block内如何修改block外部变量
__block int a 0;void (^foo)(void) ^{a 1;};foo(); //这里a的值被修改为1六、__block与__weak的区别
1.__block不管是ARC还是MRC模式下都可以使用可以修饰对象还可以修饰基本数据类型。 2.__weak只能在ARC模式下使用也只能修饰对象NSString不能修饰基本数据类型int。 3.__block对象可以在block中被重新赋值__weak不可以。 4.__block对象在ARC下可能会导致循环引用非ARC下会避免循环引用__weak只在ARC下使用可以避免循环引用。