在 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的主要内容,如果未能解决你的问题,请参考以下文章
只能在使用队列创建的 NSManagedObjectContext 上使用 -performBlock:
在 performBlock 中重置我的 NSManagedObjectContext 时,iOS 8 应用程序崩溃
NSManagedObjectContext: performBlockAndWait vs performBlock 通知中心