ios - 在异步操作后设置 CoreData 字段(但不包括其他字段)时的 EXC_BAD_ACCESS

标签 ios objective-c core-data asynchronous automatic-ref-counting

我有一个包含以下方法的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/

相关文章:

ios - 如何添加实例变量并在自定义 UIButton 中使用它

ios - Swift - 保存核心数据后更新 Tableview

ios - 循环保存到CoreData

ios - wav 到 aac 转换 interruptListener 不在 ios 中调用

objective-c - awakeFromNib 末尾布局不正确 - 需要调整大小来纠正它

objective-c - 比较两个 NSURL 或一个 NSURL 和一个 NSString 的可靠方法?

iphone - 如何从 NSSet 访问值?

json - 在 Swift 中将 JSON 字典导入到 Core Data

objective-c - 在 View Controller 之间传递字典

iphone - 如何跨多个 View Controller 处理通用 xib 或控件?