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 时,它在完成 main 方法后立即收到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 回答