我有一个VC将块传递给类方法.在块执行之前,VC会从UINavigationController中d出.以__block MyVC * weakSelf = self形式的弱引用被传递给块,然后转换为MyVC * strongSelf = weakSelf(又称弱/强舞).任何干预者都不会保留该区块.
在这种情况下,我在代码中看到的是:
>d出VC时会调用VC的dealloc.
>该块最终被调用.
>应用程序崩溃,因为我正在访问垃圾(strongSelf指向它).
我的问题是:我不希望我的VC在块最终执行之前保持活动状态,但是一旦块被执行,我想确认strongSelf是有效的.
我已经检查了这个(non-trivial example by Apple),这是行不通的,因为它的设计考虑了ARC.那么我如何才能与MMM有相同的行为?理想情况下,我希望得到__weak所做的:如果retainCount达到零,我希望它的引用指向nil而不是垃圾.
从Apple阅读之后:
In some cases you can use __unsafe_unretained if the class isn’t
__weak compatible. This can,however,become impractical for nontrivial cycles because it can be hard or impossible to valIDate
that the __unsafe_unretained pointer is still valID and still points
to the same object in question.
既然我无法访问__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 – 手动内存管理中的弱/强“舞蹈”所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)