0

プロジェクトを ARC に変換していたところNSOperation、バックグラウンドで画像をダウンロードするサブクラスに到達したときに、コードがクラッシュし始めました。

だから私は私のNSOperationサブクラスとそのメインコードを持っています:

- (void)main
{
    Post *p = [[Post alloc] initWithNewManagedObjectContext];
    Post *post = (Post *)[p findById:postId];
    [post downloadAndProcessImageOfTypeThumbOrAll:thumbOrAll];

    if (![self isCancelled]) {
        [target performSelectorOnMainThread:afterCompletionAction withObject:postId waitUntilDone:NO];
    }
}

このコードは、ARCなしで (適切なリリースで) コンパイルすると機能しますが、ARC に変換すると、メイン メソッドの終了直後にEXC_BAD_ACCESS例外を受け取りました。

これは、ARC がオブジェクトをリリースする前に、おそらく Posts オブジェクトをリリースすることに関連していると思います。しかし、それらをより長く保持する方法がわかりません。

また、[[Post alloc] initWithNewManagedObjectContext];既存のコンテキストを作成または再利用して、CoreData からオブジェクトにアクセスします。

ヒントはありますか?

4

1 に答える 1

0

実際、友人が問題を見つけるのを手伝ってくれました。すべてのコメントに感謝します。

問題はNSManagedObjectContext、バックグラウンド スレッドによってアクセスされていた にありました。

解決策は、バックグラウンド スレッド用の新しいコンテキストを作成することでした。使用されたトリックはthreadDictionary、必要に応じて他のバックグラウンド スレッドがアクセスできるようにコンテキストを保存することでした。

これで[[Post alloc] initWithNewManagedObjectContext];、別のコンテキストが作成されます。

NSManagedObjectContext *managedObjectContext = nil;
NSThread *thread = [NSThread currentThread];
managedObjectContext = [[thread threadDictionary] valueForKey:@"managedObjectContext"];

if (!managedObjectContext) {
    GTCoreData *gtcd = [[GTCoreData alloc] init];
    NSPersistentStoreCoordinator *coordinator = [gtcd persistentStoreCoordinator];
    if (coordinator != nil) {
        managedObjectContext = [[NSManagedObjectContext alloc] init];
        [managedObjectContext setPersistentStoreCoordinator:coordinator];
        [[thread threadDictionary] setValue:managedObjectContext forKey:@"managedObjectContext"];
    }
}

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Post" inManagedObjectContext:managedObjectContext];
Post *post = [[Post alloc] initWithEntity:entity insertIntoManagedObjectContext:managedObjectContext];
return post;
于 2013-02-27T17:53:37.813 に答える