下面哪个代码段是正确的?
“我”的正确定义:
- 它不应有保留周期,因此不应泄漏。
- 必须保证method2和method3的运行。所以 block 中的 MyObject 变量永远不能为 nil。(这可能出现在 __weak 定义中......)(我不想检查它是否为 nil 以防止崩溃。我总是希望它为非 nil)
更新:(附加信息) 在我用 __weak 替换 __block 之前,Instruments 工具确实显示了奇怪的泄漏。然而,在那之后我想起了 __weak 引用可能随时消失。我必须确保它不会消失和泄漏。我没有计时器。这个 someMethod 在观察到特定的 NSNotification 时在主线程上调用。
@implementation MyObject...
-(void)someMethod{
AnotherObject *abc=[[AnotherObject alloc]init];
__weak MyObject *weakSelf=self;
abc.onSuccess=^{
__strong MyObject * strongSelf = weakSelf;
[strongSelf method2];
[strongSelf method3];
}
}
或
@implementation MyObject...
-(void)someMethod{
AnotherObject *abc=[[AnotherObject alloc]init];
__block MyObject *blockSelf=self;
abc.onSuccess=^{
[blockSelf method2];
[blockSelf method3];
blockSelf=nil;
}
}
更新 2: 如果我不使用 __weak,实际代码总是会泄漏:
__block RButton *_self=self;
_aimageView.onSuccess=^(void){
[_self.headerLabel setText:[_self.book title]];
_self = nil;
};
最佳答案
block 可以提及 self
而不会导致任何泄漏。所以首先要做的是具体情况。为什么你认为你的 block 泄漏?你检查过了吗?如果没有理由担心,就没有必要担心。
如果该 block 提到的 self
确实 导致泄漏,那么您可以采取的步骤取决于发生这种情况的原因。但你没有向我们展示这一点。例如,提及 self
的分派(dispatch)计时器 block 可能会导致保留周期,但当您完成计时器后,您可以中断该周期,这样就不会发生泄漏。
因此,最好了解特定的保留周期,而不是在不必要时对每个 block 进行防御性编程。
编辑(回应您的评论)此代码 from my book演示了在 NSNotification 观察者情况下处理内存管理的各种方法:click here
关于ios - 在 iOS 上使用带有 ARC 的 block 时,确保对象存在并且不会泄漏的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21355318/