Block中出现循环引用处理

block在iOS开发中被视作是对象,因此其生命周期会一直等到持有者的生命周期结束了才会结束。另一方面,由于block捕获变量的机制,使得持有block的对象也可能被block持有,从而形成循环引用,导致两者都不能被释放:

@implementation LXDObject

{

void (^_cycleReferenceBlock)(void);

}

- (void)viewDidLoad

{

[super viewDidLoad];

_cycleReferenceBlock = ^{

NSLog(@"%@", self);  //引发循环引用

};

}

@end

遇到这种代码编译器只会告诉你存在警告,很多时候我们都是忽略警告的,这最后会导致内存泄露,两者都无法释放。跟普通变量存在__block关键字一样的,系统提供给我们__weak的关键字用来修饰对象变量,声明这是一个弱引用的对象,从而解决了循环引用的问题

__weak typeof(*&self) weakSelf = self;

_cycleReferenceBlock = ^{

NSLog(@"%@", weakSelf);  //弱指针引用,不会造成循环引用

};

对于block这种有趣的特性,在唐巧的谈谈Objective-C block的实现有详细介绍block的底层实现代码,我在这里就不多说了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容