0

我有一个UserService包含以下方法的单例。我book.downloaded在进度回调中设置的行上收到了 EXC_BAD_ACCESS。

我希望服务继续下载和更新图书对象,即使用户退出他们所在的视图(当前是表格的详细视图)。如果我保持详细视图打开,这一切都很好,但是当我回到父表视图时,我得到了错误的访问权限。

我的第一个想法是bookARC 正在发布它,但这并不成立。您可以设置其他属性,甚至读取 的当前值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我在详细信息视图中进行键值观察,这将启动此操作。如果我注释掉键值观察,它不会出错。为什么?(显然这使我的观点没有更新)。这解释了为什么只有那个属性会抛出错误(它是唯一一个被观察到的键值)。

4

1 回答 1

1

dealloc我并没有在我的详细信息视图中删除我的键值观察者。以下摆脱了错误。(在详细信息视图中)

-(void)dealloc {
    [self.book removeObserver:self forKeyPath:@"downloaded"];
    [self.book removeObserver:self forKeyPath:@"purchased"];
}

我以为 ARC 会为我解决这个问题,但我觉得它不知道怎么做是有道理的。我也不太明白这将如何导致我得到它的线路上的访问不正确。似乎它会在解除分配的观察者中提供错误的访问权限。

于 2013-02-05T16:29:49.377 回答