2011-02-23 142 views
0

我已經開始在我的項目中使用CoreData。沒有CodeData的代碼,我的項目工作得很好。我添加了從coreData項目模板訪問NSManagedObjectContext的方法。現在,我嘗試創建新CoreData對象用下面的代碼:「[CFString發佈]:消息發送到釋放實例」使用CoreData時

- (void)saveSearchResultToHistory:(NSArray *) productsArray { 
    [productsArray retain]; 

    NSLog(@"context: %@", self.managedObjectContext); 

    Product *product = [NSEntityDescription 
            insertNewObjectForEntityForName:@"Product" 
            inManagedObjectContext:self.managedObjectContext]; 
product.productId = [(Product *) [productsArray objectAtIndex:0] productId]; 

NSError *error; 
if (![self.managedObjectContext save:&error]) { 
    NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]); 
} 


[productsArray release]; 
} 

當這個方法被跑一次,然後一切都很好,當我嘗試運行它第二次,處理停止在:

Product *product = [NSEntityDescription 
            insertNewObjectForEntityForName:@"Product" 
            inManagedObjectContext:self.managedObjectContext]; 

與在控制檯以下錯誤消息:

[CFString字符串挽留]:消息發送到釋放的實例0x5a23b0

任何想法可能是錯誤的? 謝謝!

回答

0

首先,您不需要在每次添加內容時保存上下文,只需在應用程序關閉或在後臺執行時保存即可。

你正在得到的錯誤看起來像你通過釋放NSString一些地方。

要檢查是否錯誤不在coredata環境中使用該保存功能:

- (void)saveContext { 
    if ([self.managedObjectContext hasChanges]) { 
     NSError *error = nil; 
     if (![self.managedObjectContext save:&error]) { 

      dbgPrint(@"Failed to save to data store: %@", [error localizedDescription]); 

      NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey]; 

      if (detailedErrors != nil && [detailedErrors count] > 0) { 
       for(NSError* detailedError in detailedErrors) { 
        dbgPrint(@"--DetailedError: %@", [detailedError userInfo]); 
       } 
      } else { 
       dbgPrint(@" %@", [error userInfo]); 
      } 
     } 
    } 
}  
+0

是,節能的背景下只有一次,在某處年底纔有意義。感謝您指出了這一點! – Jakub 2011-02-23 14:23:58

相關問題