2010-08-25 34 views
0

當我嘗試保存模型時,出現奇怪的崩潰。這是我的代碼:保存managedObjectContext時出現奇怪的崩潰

TJModel *model = [TJModel sharedTJModel]; 
NSFetchRequest *request = [[[NSFetchRequest alloc] init]autorelease]; 
[request setReturnsObjectsAsFaults:NO]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"TJVideoList"inManagedObjectContext:[model managedObjectContext]]; 
[request setEntity:entity]; 

NSError *error = nil; 
NSMutableArray *mutableFetchResults = [[[model managedObjectContext] executeFetchRequest:request error:&error] mutableCopy]; 

if (error != nil) 
    NSLog(@"error %@",[error localizedDescription]); 


TJVideoList *videoList = nil; 

if ([mutableFetchResults count] == 0) { 

    videoList = (VideoList *)[NSEntityDescription insertNewObjectForEntityForName:@"TJVideoList" 
       inManagedObjectContext:[model managedObjectContext]]; 
} 
else 
{ 
    videoList = [mutableFetchResults objectAtIndex:0]; 
} 


[videoList addVideoListObject:recordedVideo]; 
error = nil; 

if (![[model managedObjectContext] save:&error]) { 

和崩潰.....這就是在終端說:

-[NSConcreteValue UTF8String]: unrecognized selector sent to instance 0x1d33f0 

我想這可能是釋放對象的cuestion,所以我保留他們像這個:

[managedObjectContext setRetainsRegisteredObjects:YES]; 

沒有運氣。

+0

什麼行崩潰,'保存:'? – TechZen 2010-08-25 19:47:17

回答

1

您的崩潰不是此代碼的結果。

保存中的崩潰通常是由於managedObject的屬性出錯導致的。在這種情況下,你有某個地方給string屬性賦了錯誤的值。當上下文將字符串屬性轉換爲UTF8字符串進行持久化時,存在的對象(而不是NSString)不理解該消息和崩潰結果。

儘管此代碼應該運行沒關係,你確實有一些危險的做法:

NSFetchRequest *request = [[[NSFetchRequest alloc] init]autorelease]; 

這是一種不好的做法。 autorelease與發佈相同。除非完整完成,否則不應將其發送給對象。 autorelease在下次內存池耗盡時標記死亡對象。在某些情況下,這會意外地殺死對象。雖然這不會造成問題,但你不想養成這樣的捷徑,因爲它最終會咬你。

當電流範圍與對象完成,但對象被範圍外發送,才應使用自動釋放(通常是方法的返回。)

NSMutableArray *mutableFetchResults = [[[model managedObjectContext] executeFetchRequest:request error:&error] mutableCopy]; 

這裏的可變數組是毫無意義的是副本。這顯然是在某些參考資料的某處,因爲它在過去幾個月裏不斷出現新手代碼。如果你不打算修改一個數組,那麼沒有理由讓它變化。在管理對象數組的情況下,複製數組毫無意義。

videoList = [mutableFetchResults objectAtIndex:0] 

既然你已經爲獲取無排序描述符,該mutableFetchResults陣列將在一個隨機順序。如果您返回多個對象(幾乎總是這樣),則每次運行代碼時,都會在零元素處隨機獲取一個對象TJVideoList

+0

順便說一句,'-mutableCopy'垃圾是蘋果的例子。我已經提出了一個反對它的雷達。這也是在開始iPhone開發的書(從蘋果說明文件複製)。 – 2010-08-26 02:50:23

+0

非常感謝您的信息和特別的建議,它們非常寶貴。正如馬庫斯所說,我從蘋果的例子中得到了代碼。所有閃光的不都是金子! – toupper 2010-08-26 08:04:24

+0

@Marcus S. Zarra - 啊哈!現在我們找到了吸血鬼的巢穴,我們可以在它的心臟中開出一樁股東! – TechZen 2010-08-26 12:30:46

1

聽起來更像你指定一個NSValue實例(NSNumber,很有可能,因爲它是最常用的子類),其中NSString是預期的。 -retainsRegisteredObjects:不太可能是需要的(它不會解決與內存有關的問題)。

這也可能是一個過度釋放問題。嘗試運行殭屍檢測啓用(請參閱運行菜單)。