NSManagedObject在NSOperation(ARC)上崩溃

时间:2013-02-25 23:44:42

标签: ios objective-c core-data exc-bad-access nsoperation

我正在将我的项目转换为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 异常。< / p>

我猜这是与ARC相关的东西,它应该发布任何对象,也许是Posts对象。但我不知道如何更长时间地保留它们。

此外,[[Post alloc] initWithNewManagedObjectContext];创建或重用现有上下文以从CoreData访问对象。

任何提示?

1 个答案:

答案 0 :(得分: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;