千家信息网

block循环引用问题的示例分析

发表于:2024-10-18 作者:千家信息网编辑
千家信息网最后更新 2024年10月18日,小编给大家分享一下block循环引用问题的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!从iOS4.0开始,obj
千家信息网最后更新 2024年10月18日block循环引用问题的示例分析

小编给大家分享一下block循环引用问题的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

从iOS4.0开始,objective C中引入了block技术。block跟标准c的函数类似,block的引入使得代码回调更加方便。

优点:

(1)、回调直接写在需要触发的地方,使代码更具有连续性。

(2)、在代码块内部可以访问局部变量

但是,如果block使用不慎,将引起内存泄露。

1、为啥会引起内存泄露?

在block代码块里,如果传入了代码块外部的对象,block会对该对象进行retain,持有该对象,造成循环引用。

eg:

@interface TestBlockObject : NSObject

- (void)invokeBlock:(void (^)(void))testBlock;

@end

@implementation TestBlockObject

- (void)invokeBlock:(void (^)(void))testBlock{

NSLog(@"TestBlockObject");

}

@end

//调用

@interface ViewController ()

{

TestBlockObject *ob;

}

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

ob = [TestBlockObject new];

[ob invokeBlock:^{

//引起循环引用

[self testPrint];

}];

}

- (void)didReceiveMemoryWarning {

[super didReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

- (void)testPrint{

NSLog(@"哈哈");

}

@end

引起循环引用的地方

[ob invokeBlock:^{

//引起循环引用

[self testPrint];

}];

ViewController(self)持有ob,ob的block中持有self,导致了循环引用。self对象将不会被销毁,从而ob也不会被销毁,引起内存泄露。

2、解决循环引用方法

使用以下的代码替换红色代码

__weak typeof(self) weakSelf = self;

[ob invokeBlock:^{

if (weakSelf) {

[weakSelf testPrint];

}

}];

通过将self转换成weak对象,然后再block中使用,破坏循环引用。

3、特殊的地方

若在ViewController的viewDidLoad加入下方的代码,是不会导致循环引用的。因为代码块是类方法,ViewController没有持有该部分内存。当block执行结束后,block就会被释放掉,因而self就不会被持有。

[UIView animateWithDuration:0.5 animations:^{

[self testPrint];

}];

以上是"block循环引用问题的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

循环 代码 对象 内存 地方 篇文章 示例 问题 分析 内容 方法 特殊 不怎么 不慎 优点 函数 变量 大部分 局部 技术 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 软件开发行业的痛苦 安装ftp服务器 nas互联网科技公司 数据库只知道年龄查询出生 成都软件开发必问青岗科技 广州销售软件开发 网络安全人才培训 上市公司 东阳义乌互联网科技 北京班信网络技术公司 斗罗大陆回流服为什么没有服务器 沈阳安卓软件开发公司哪家好 网络安全在我们身边手抄报初中 ftp服务器软件那个好 反邪教网络安全作文 网络工程专业中的网络安全 网络安全宣传周在成都 网络安全工具有哪些 区块链服务器如何架构更安全 中国互联网企业不搞科技 数据库原理与技术上机实验4 广东长实网络技术有限公司 大学生网络安全宣传主题班会 教学软件开发的合同模板下载 服务器内存条多少钱 互联网络安全和通信网络安全 国三网络技术题库 百度云 网络安全的最大隐患 自己组装好的服务器怎么连接mc 能打开DB3数据库的软件 鸿特科技和互联网
0