block
(如有错误,或者有一些建议 , 请联系我 愿意听取建议)
- block 比函数灵活 可以在程序里面设定 也可以在程序外面设定
- block 主要用于封装程序 到适应的时候调用 (有参数 和 无参数)
- block 重命名 typedef int (^MyBlock)
(int,int) 其中 int (^MyBlock)表示返回值参数以及 重命名之后 block
名字 后面是俩形参
- 起初 没有多线程时 整个程序中只有一条线程
- 在block 代码块中如果用 self 强引用 会出现 循环引用的问题 , 导致 内存不能被释放 所以在block 代码块外面
引用弱指针 是为了内存能彻底释放
在 block 代码中
一般不要用到外面东西
如果在 block
代码中必须用到外面的东西 (block 中有代理设置为self)
最后 会产生强引用 结果无法释放
结决方法 (防止block循环引用) : 先把它弄出来声明为弱指针
- __unsafe_unretainsd typeof(self) selfVc =
self; - __weak typeof(self) selfVc = self;
- __weak (当前控制器 *) selfVc = self;
上面三种方法 都要在block上面写 意思是:
- 声明一下 下面的self 就是这个控制器 并且变为弱指针
但这样同时存在一个问题 __weak弱引用随时可能被销毁
- 但在多线程中 子线程运行完毕后就会被释放,所以在子线程的block
代码快中可以采用self强引用 保证了能执行每一次的块代码 最后直接销毁
只有self直接强引用block,才会出现循环引用
(内存不能释放)
block的管理以及线程的创建和销毁是由队列负责的,直接在block中使用self没有关系!
时间: 2024-10-09 03:35:34