我有一个UserService
包含以下方法的单例。我book.downloaded
在进度回调中设置的行上收到了 EXC_BAD_ACCESS。
我希望服务继续下载和更新图书对象,即使用户退出他们所在的视图(当前是表格的详细视图)。如果我保持详细视图打开,这一切都很好,但是当我回到父表视图时,我得到了错误的访问权限。
我的第一个想法是book
ARC 正在发布它,但这并不成立。您可以设置其他属性,甚至读取 的当前值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);
}
];
}
更新book.downloaded
我在详细信息视图中进行键值观察,这将启动此操作。如果我注释掉键值观察,它不会出错。为什么?(显然这使我的观点没有更新)。这解释了为什么只有那个属性会抛出错误(它是唯一一个被观察到的键值)。