iOS block里用下划线调使用实例变量会对self强引使用的起因

作者 : 开心源码 本文共1472个字,预计阅读时间需要4分钟 发布时间: 2022-05-12 共286人阅读

如题, 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强引使用的起因

发表回复