我有一个包含以下方法的UserService
单例。我在进度回调中设置 book.downloaded
的行上收到 EXC_BAD_ACCESS。
我希望服务继续下载并更新图书对象,即使用户退出他们所在的 View (当前是表格的详细 View )。如果我保持详细 View 打开,一切都可以正常工作,但是当我返回到父 TableView 时,访问权限会很差。
我的第一个想法是 ARC 正在发布book
,但这并不成立。您可以设置其他属性,甚至可以读取 book.downloaded 的当前值,但在您尝试设置它的那一刻。繁荣。
Book
是由 mogenerator 生成的 CoreData 类(如果重要的话)。
// UserService is a singleton.
// Only errors if I back out of the detail view to the parent table view.
-(void)addBook:(Book *)book downloadProgress:(void (^)(Book *))progressCb downloadComplete:(void (^)(Book *))cb {
book.purchasedValue = YES;
book.downloadedValue = 0.0;
// making my UserService own the book with a strong reference doesn't help
self.strongBookProperty = book;
[FileService.shared
downloadFiles:[FileService.shared byBookId:book.bookId]
progress:^(float percent) {
book.title = @"fake title"; // no error!
NSLog(@"old downloaded %@", book.downloaded); // no error!
book.downloaded = [NSNumber numberWithFloat:percent]; // EXC_BAD_ACCESS
progressCb(book);
}
complete:^() {
book.downloaded = [NSNumber numberWithFloat:1.0];
cb(book);
}
];
}
更新 我正在详细信息 View 中观察 book.downloaded
的键值,从而启动此操作。如果我注释掉键值观察,它就不会出错。为什么? (显然这使我的观点无法更新)。这解释了为什么只有该属性抛出错误(它是唯一被观察到的键值)。
最佳答案
我没有在详细信息 View 的 dealloc
方法中删除书中的键值观察者。以下消除了错误。 (在详细信息 View 中)
-(void)dealloc {
[self.book removeObserver:self forKeyPath:@"downloaded"];
[self.book removeObserver:self forKeyPath:@"purchased"];
}
我以为 ARC 会帮我处理这个问题,但我觉得它不知道如何处理是有道理的。我也不太明白这会如何导致我收到的线路访问不良。看起来它会给解除分配的观察者带来不好的访问。
关于ios - 在异步操作后设置 CoreData 字段(但不包括其他字段)时的 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14711667/