0

次のメソッドを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これを開始する詳細ビューでキー値を監視しています。キー値の観察をコメントアウトしても、エラーにはなりません。なんで?(明らかに、これにより私のビューは更新されません)。これは、そのプロパティのみがエラーをスローした理由を説明しています (キー値が観察されているのはこれだけです)。

4

1 に答える 1

1

dealloc詳細ビューのメソッドで、本のキー値オブザーバーを削除していませんでした。以下はエラーを取り除きました。(詳細ビューで)

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

私はARCがそれを処理してくれると思っていましたが、ARCが方法を知らないのは理にかなっています. また、それが取得していた回線でどのようにアクセス不良を引き起こすのか、よくわかりません。代わりに、割り当て解除されたオブザーバーに悪いアクセスを与えるようです。

于 2013-02-05T16:29:49.377 に答える