在 performBlock 中分配时 NSManagedObjectContext nil

Posted

技术标签:

【中文标题】在 performBlock 中分配时 NSManagedObjectContext nil【英文标题】:NSManagedObjectContext nil when assigned within performBlock 【发布时间】:2013-10-22 10:01:02 【问题描述】:

我被要求修复这个不起作用的代码,这是一个常见的后台任务。

    __weak NSManagedObjectContext *weakCtx=[CDC privateManagedObjectContext]; // convenient class+macro for obtaining a private context queue
    __weak id weakSelf = self;
    [weakCtx performBlock:^
        __strong id strongSelf = weakSelf;
        __strong NSManagedObjectContext *ctx = weakCtx; // <-- nil
        // more code following
    ];

这个问题是由代码后面的ctx 为 nil 引起的。但是,如果我在块内设置断点,我可以看到虽然 weakCtx 仍然有效,但 ctx 得到一个 nil 值,这导致块失败。

相反,weakSelf 被正确分配,并在其余代码中工作。

我错过了什么?

【问题讨论】:

同样的老反对票...来,反对票,然后去... 【参考方案1】:

您不必在此处使用__weak 修饰符作为上下文,因为它不是ivar(因此self 不会保留它)。这应该有效:

NSManagedObjectContext *ctx=[CDC privateManagedObjectContext];
__weak id weakSelf = self;
[ctx performBlock:^
    __strong id strongSelf = weakSelf;
    // use `ctx` here
];

【讨论】:

以上是关于在 performBlock 中分配时 NSManagedObjectContext nil的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 的 performBlock: 和故障

只能在使用队列创建的 NSManagedObjectContext 上使用 -performBlock:

NSThread gtm_performBlock 错误

在 performBlock 中重置我的 NSManagedObjectContext 时,iOS 8 应用程序崩溃

NSManagedObjectContext: performBlockAndWait vs performBlock 通知中心

取消 NSManagedObjectContext performBlock