ios - 在 iOS 上使用带有 ARC 的 block 时,确保对象存在并且不会泄漏的正确方法是什么?

标签 ios objective-c memory-leaks automatic-ref-counting objective-c-blocks

下面哪个代码段是正确的?

“我”的正确定义:

  • 它不应有保留周期,因此不应泄漏。
  • 必须保证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/

相关文章:

android - 布局内存泄漏?

c++ - 了解 Valgrind 输出

javascript - 滚动到 Cordova 聚焦场

ios - 通过点击控制文本 alpha,通过平移手势控制屏幕亮度

ios - 我可以在 TableView Controller 中有另一个 TableView 吗?

ios - 让我的背景音乐播放器停止? objective-c

ios - NSUserDefaults removeObjectForKey

ios - 如何在 Objective-C 中将完成处理程序分配给另一个完成处理程序

ios - 带有嵌入式导航 Controller 的 Popover 不考虑后退导航的大小

java - 如何在组件的设计阶段防止内存泄漏?