Objective-C中block循环引用问题详解

编程之家收集整理的这篇文章主要介绍了Objective-C中block循环引用问题详解编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

目标:block执行过程中,self不会释放;执行完可以释放。

最初

block中直接使用self会强引用。

self.myBlock = ^() {
 [self doSomething];
};

或者使用了对象的属性

self.myBlock = ^() {
 NSString *str = _str;
 NSString *str2 = self.str;
};

在这样的情况下,self强引用block,block也持有该对象,导致循环引用。

要注意的是,只有在self强引用block的时候才会有这样的问题。一般使用GCD或NSOperation时使用的内联block是不会出现循环引用的。

加入weak self

__weak __typeof(self) weakSelf = self;
self.myBlock = ^() {
 [weakSelf doSomething];
};

这样,self持有了block,但block对self是弱引用,就不会导致循环引用了。

而在[weakSelf doSomething]过程中,self是不会释放的,完美。

但是,如果是这样呢?

__weak __typeof(self) weakSelf = self;
self.myBlock = ^() {
 [weakSelf doSomething];
 [weakSelf doSomething2];
};

在[weakSelf doSomething]和[weakSelf doSomething2]之间,self可能会被释放掉。这可能会导致奇怪的问题。

加入strong self

__weak __typeof(self) weakSelf = self;
self.myBlock = ^() {
 __strong __typeof(self) strongSelf = weakSelf;
 [strongSelf doSomething];
 [strongSelf doSomething2];
};

这样,block既没有持有self,又能保证block在执行过程中self不被释放,真正达到了最初的目标。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持

总结

以上是编程之家为你收集整理的Objective-C中block循环引用问题详解全部内容,希望文章能够帮你解决Objective-C中block循环引用问题详解所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢寻找一群志同道合、互帮互助的学习伙伴,可以点击下方链接加入:
编程之家官方1群
编程之家官方2群
编程之家官方3群
编程之家官方4群

相关文章

猜你在找的iOS相关文章

目前,苹果开发者账号可分为三种类型:个人、公司、企业,且三者的费用以及权限等不尽相同。 1.个人账号 费用:99 美元/年 协作人数:仅限开发者自己 不需要填写公司的邓百氏编码( D-U-N-S Nu
Symbol Value Meaning NULL (void *)0 literal null value for C pointers nil (id)0 literal null value for Objective-C objects nil:对象为空定义某一实例对象为空值。例如:NSObject* obj = nil;if (...
Android篇环境要求1 安装winrar,然后配置winrar的环境变量,要用到winrar指令2 配置java的bin目录到环境变量,要用到jarsigner指令重签名步骤说明:1 从母包复制一个子包2 删除子包的签名文件META-INFO3 根据需要修改子包的文件,比如渠道号文件之类4 重签名子包对应的python脚本import os...
转载注明出处:https://blog.csdn.net/joosonmao/article/details/21172835刚接触iOS开发的人难免会对苹果的各种证书、配置文件等不甚了解,可能你按照网上的教程一步一步的成功申请了真机调试,但是还是对其中的缘由一知半解。这篇文章就对Certificate、Provisioning Profile等做个总结。 1.概念介绍如果你拥有一个开...
转载注明出处:https://www.jianshu.com/p/567d3b730608iOS armv7, armv7s, arm64区别与应用32位、64位配置历程2015年2月1日不允许不支持arm64的应用的提交; iOS10发布后,如果你的应用中使用到了32位的类、库,没有相应支持64位机型的库,则首次启动后会弹窗式提示:“ xxx可能使iPhone变慢...”; iO...
iOS9以下的自己越狱后,通过PP助手备份到电脑或者直接通过pp助手直接下载 
转载注明出处:https://www.cnblogs.com/mtystar/p/6082363.html0x01 静态库与动态库的区别1.静态库和动态库的存在形式上的区别静态库 .a .framework 动态库 .dylib (在Xcode 8里面,看到后缀为.tbd的库,它的本质都是.dylib文件) .framework 2.静态库和动态库在使用上的区别...
终端中运行xcodebuild -showsdks
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注