HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – 手动内存管理中的弱/强“舞蹈”大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
想象一下使用手动内存管理(又称非ARC)的以下场景:

我有一个VC将块传递给类方法.在块执行之前,VC会从UINavigationController中弹出.以__block MyVC * weakSelf = self形式的弱引用被传递给块,然后转换为MyVC * strongSelf = weakSelf(又称弱/强舞).任何干预者都不会保留该区块.

在这种情况下,我在代码中看到的是:

>弹出VC时会调用VC的dealloc.
>该块最终被调用.
>应用程序崩溃,因为我正在访问垃圾(strongSelf指向它).

我的问题是:我不希望我的VC在块最终执行之前保持活动状态,但是一旦块被执行,我想确认strongSelf是有效的.

我已经检查了这个(non-trivial example by Apple),这是行不通的,因为它的设计虑了ARC.那么我如何才能与MMM有相同的行为?理想情况下,我希望得到__weak所做的:如果retainCount达到零,我希望它的引用指向nil而不是垃圾.

从Apple阅读之后:

既然我无法访问__weak,我甚至可以做什么?

解决方法

我在iOS 4.x时代就与这个问题进行了斗争.如果没有弱指针可以帮到你,这并不容易!

如果你保证稍后在主线程上执行块(即从weakSelf分配strongSelf的地方),那么你基本上需要一个存储“isDead”标志的地方,你在VC被解除分配时设置.然后在使用weakSelf / strongSelf执行任何操作之前检查此标志.一个解决方案是:

>你需要一个唯一的工作就是在成员变量中存储这个“isDead”标志的类.类似NSMutableBoolean的东西.我不会写出一个,它很简单,只需要一个BOOL属性.
>在VC的 – [NSObject init]方法中,您可以创建此标志对象的实例,该实例最初应设置为false.
>然后,您将此对象传递给您排队等待以后执行的任何块,以便自动保留/释放(即不经过弱/强舞).在块中,您在使用weakSelf执行任何操作之前检查标志是否仍为NO.
>关键当然是在VC的 – [NSObject dealloc]方法中将标志设置为YES,然后释放它.如果任何块仍在等待执行,它们将自己保留标记对象,并且当它们稍后执行时,它们将查询该标志,发现VC现在已经死亡.

这听起来很麻烦(而且有点)但是想法是“isDead”标志位于VC的范围之外,因此不依赖于它的生命周期.至于线程安全性,只要你只在VC的init / dealloc方法中设置/查询标志,并且当块执行时(在主线程上,而不是在后台线程上),它将是线程安全的.

大佬总结

以上是大佬教程为你收集整理的ios – 手动内存管理中的弱/强“舞蹈”全部内容,希望文章能够帮你解决ios – 手动内存管理中的弱/强“舞蹈”所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。