假设使用手动内存管理(又称非ARC)的以下情景:
我有一个视图控制器(VC),它将一个块传递给一个类方法。在块被执行之前,VC从UINavigationController中弹出。通过__block MyVC *weakSelf = self形式传递弱引用到块中,然后将其转换为MyVC *strongSelf = weakSelf(也称为weak/strong dance)。该块不会被任何参与者保留。
在这种情况下,我在我的代码中看到的是:
1.当VC弹出时,dealloc将被调用。
2.最终将调用该块。
3.应用程序崩溃,因为我正在访问垃圾(strongSelf指向它)。
我的问题是:我不希望我的VC一直保持活动状态,直到块最终执行,但一旦块被执行,我想确认strongSelf是否有效。
我查看了这个 ( 苹果公司提供的非平凡示例),它不能正常工作,因为它是为ARC设计的。那么如何在MMM中实现相同的行为呢?理想情况下,我希望它能像
阅读了苹果公司的内容后:
在某些情况下,如果类不兼容__weak,则可以使用__unsafe_unretained。但是,对于非平凡的循环,这可能变得不切实际,因为很难或不可能验证__unsafe_unretained指针仍然有效并且仍然指向相应的对象。
由于我无法访问__weak,那么我想做的事情是否可能?
我有一个视图控制器(VC),它将一个块传递给一个类方法。在块被执行之前,VC从UINavigationController中弹出。通过__block MyVC *weakSelf = self形式传递弱引用到块中,然后将其转换为MyVC *strongSelf = weakSelf(也称为weak/strong dance)。该块不会被任何参与者保留。
在这种情况下,我在我的代码中看到的是:
1.当VC弹出时,dealloc将被调用。
2.最终将调用该块。
3.应用程序崩溃,因为我正在访问垃圾(strongSelf指向它)。
我的问题是:我不希望我的VC一直保持活动状态,直到块最终执行,但一旦块被执行,我想确认strongSelf是否有效。
我查看了这个 ( 苹果公司提供的非平凡示例),它不能正常工作,因为它是为ARC设计的。那么如何在MMM中实现相同的行为呢?理想情况下,我希望它能像
__weak
一样:如果retainCount
达到零,我希望它的引用指向空值而不是垃圾。
阅读了苹果公司的内容后:
在某些情况下,如果类不兼容__weak,则可以使用__unsafe_unretained。但是,对于非平凡的循环,这可能变得不切实际,因为很难或不可能验证__unsafe_unretained指针仍然有效并且仍然指向相应的对象。
由于我无法访问__weak,那么我想做的事情是否可能?