-1

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

    __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
    ];

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

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

我错过了什么?

4

1 回答 1

0

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

NSManagedObjectContext *ctx=[CDC privateManagedObjectContext];
__weak id weakSelf = self;
[ctx performBlock:^{
    __strong id strongSelf = weakSelf;
    // use `ctx` here
}];
于 2013-10-22T10:13:39.083 回答