2010-08-25 49 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:不太可能是需要的(它不会解决与内存有关的问题)。

这也可能是一个过度释放问题。尝试运行僵尸检测启用(请参阅运行菜单)。