在performBlock中分配时,NSManagedObjectContext为nil

时间:2013-10-22 10:01:02

标签: objective-c core-data nsmanagedobjectcontext

我被要求修复此代码无效,这是一项常见的后台任务。

    __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为零的代码后期引起的。但是如果我在块中放置断点,我可以看到虽然weakCtx仍然有效,但ctx会得到一个nil值,这会导致块失败。

相反,weakSelf正确分配,并通过其余代码工作。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

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

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