2013-02-25 48 views
0

我正在將我的項目轉換爲ARC,當我到達一些NSOperation子類負責在後臺下載一些圖像時,代碼開始崩潰。NSManagedObject在NSOperation(ARC)上崩潰

所以,我有我的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發佈任何對象之前它應該,也許是帖子對象有關的東西。但我不知道如何長時間保留它們。

此外,[[Post alloc] initWithNewManagedObjectContext];創建或重新使用現有上下文從CoreData訪問對象。

任何提示?

+1

運行文書'NSZombiesEnabled'。這對這類問題有很大的幫助。 – borrrden 2013-02-26 01:13:42

+0

什麼是目標?你是否保持強烈的參考?如果你沒有強引用,它會立即釋放,在'performSelectorOnMainThread:'可以運行之前......這意味着你將發送一個消息給一個釋放對象。 – nielsbot 2013-02-26 02:24:46

+0

'post'也將被釋放,除非你在其他地方有一個引用。 – nielsbot 2013-02-26 02:25:38

回答

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; 
相關問題