我被要求修复此代码无效,这是一项常见的后台任务。
__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正确分配,并通过其余代码工作。
我错过了什么?
答案 0 :(得分:0)
您不必在此处使用__weak
修饰符,因为它不是ivar
(因此self
不会保留它)。这应该有效:
NSManagedObjectContext *ctx=[CDC privateManagedObjectContext];
__weak id weakSelf = self;
[ctx performBlock:^{
__strong id strongSelf = weakSelf;
// use `ctx` here
}];