oc block 中直接引用成员变量 循环引用
来源:互联网 发布:java的wait方法 编辑:程序博客网 时间:2024/05/21 09:58
问题的答案是一定会发生循环引用。
那解决方式:
__weak typeof(self) wself = self;
用wself访问成员变量就好。既然发生了循环引用一定是retain了self了,那又是为什么block不retain成员变量指针会retain self 呢?
原因是oc是动态语言,实例变量的地址可能被其他实例变量占用,直接引用的话容易出问题。
retain self的好处是当类的定义变了,其存储的偏移量也变了,偏移量会在运行时查找,这样的话无论何时访问总能得到正确的地址,甚至可以在运行时新增变量。
- struct objc_class {
- Class isa OBJC_ISA_AVAILABILITY;
- #if !__OBJC2__
- Class super_class OBJC2_UNAVAILABLE;
- const charchar *name OBJC2_UNAVAILABLE;
- long version OBJC2_UNAVAILABLE;
- long info OBJC2_UNAVAILABLE;
- long instance_size OBJC2_UNAVAILABLE;
- struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
- struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
- struct objc_cache *cache OBJC2_UNAVAILABLE;
- struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
- #endif
- } OBJC2_UNAVAILABLE;
其中objc_ivar_list
结构体存储着objc_ivar
数组列表,而objc_ivar结构体存储了类的单个成员变量的信息。
Ivar
在objc中被定义为:
它是一个指向objc_ivar结构体的指针,结构体有如下定义:
这里我们注意第三个成员 ivar_offset
。它表示基地址偏移字节。
0 0
- oc block 中直接引用成员变量 循环引用
- 私有成员变量在block如何避免循环引用
- block:解决成员变量的循环引用的问题
- iOS开发之 成员变量 解决block循环引用方案
- block:解决成员变量的循环引用的问题
- block块中引用成员变量引起内存泄漏问题
- iOS开发---私有成员变量在block如何避免循环引用
- iOS OC 成员变量是强引用还是弱引用
- iOS OC 成员变量是强引用还是弱引用
- block 中循环引用的问题
- ios中block的循环引用
- Block 代码块中循环引用问题
- iOS中Block的循环引用问题
- iOS中block的循环引用问题
- iOS Block 中 循环引用的解决
- Block的循环引用
- block循环引用
- Block的循环引用
- eclipse 中GC overhead limit exceeded处理办法
- C#图片缩小剪切方法
- MongoDb数据库-I基础
- 一张图带你过C语言文件读写
- 什么是跨域?
- oc block 中直接引用成员变量 循环引用
- Java中Date与String相互转换的方法
- Iterator与foreach遍历
- hibernate@ManytoOne 有连接表
- 《第一行代码》完结
- CAN总线原理
- QuartusII9.0创建工程、设计与仿真
- markdopwn pad2激活码
- FBI树 (建立)遍历二叉树