iOS block里用下划线调使用实例变量会对self强引使用的起因
如题, oc代码如下:
@interface ViewController ()@property (strong, nonatomic) NSObject *aaaaaaaa;@property (strong, nonatomic) void(^bbbbbb)(void);@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; self.bbbbbb = ^{ _aaaaaaaa = [NSObject new]; };}@end依据我们以往对block的内存管理的思考方式:
self 强引使用 _bbbbb,而在 _bbbbb 里强引使用了_aaaa,按道理是不会造成循环引使用的。</br>
而实际上,这会造造成循环引使用!
clang后block代码如下(部分)
// block的父类结构体struct __block_impl { void *isa;// 有isa指针,就是属于对象范畴 int Flags; int Reserved; void *FuncPtr;};// viewDidLoad 方法里的第一个blcokstruct __ViewController__viewDidLoad_block_impl_0 { struct __block_impl impl;// 父 struct __ViewController__viewDidLoad_block_desc_0* Desc; ViewController *self; // 本结构体“强引使用”ViewController *类型的成员变量(self) // 构造函数 __ViewController__viewDidLoad_block_impl_0(void *fp, struct __ViewController__viewDidLoad_block_desc_0 *desc, ViewController *_self, int flags=0) : self(_self) { // 传进ViewController *_self, 将_self赋值给本结构体里的"self" impl.isa = &_NSConcreteStackBlock; impl.Flags = flags; impl.FuncPtr = fp; Desc = desc; }};/// block的形容static struct __ViewController__viewDidLoad_block_desc_0 { size_t reserved; size_t Block_size; void (*copy)(struct __ViewController__viewDidLoad_block_impl_0*, struct __ViewController__viewDidLoad_block_impl_0*); void (*dispose)(struct __ViewController__viewDidLoad_block_impl_0*);} __ViewController__viewDidLoad_block_desc_0_DATA = { 0, sizeof(struct __ViewController__viewDidLoad_block_impl_0), __ViewController__viewDidLoad_block_copy_0, __ViewController__viewDidLoad_block_dispose_0};由此可见,下划线访问实例变量实际是通过 self->_aaaaaaaa 来访问的,所以代码会造成强引使用。
说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » iOS block里用下划线调使用实例变量会对self强引使用的起因
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » iOS block里用下划线调使用实例变量会对self强引使用的起因