2013-10-22 35 views
-1

我被要求修复这个不工作的代码,这是一个常见的后台任务。NSManagedObjectContext在performBlock中分配时为零

__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会得到一个零值,这会导致块失败。

而在相反的情况下,weakSelf被正确分配,并且通过代码的其余部分工作。

我错过了什么?

+0

同样的老downvoter ...来,downvote,并去... – Leonardo

回答

0

对于上下文,您不必使用__weak修饰符,因为它不是ivar(所以它不会被self保留)。这应该工作:

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