2011-05-02 69 views
0

当我尝试使用NSManagedObject子类时遇到了一个奇怪的问题。我有代码看起来是这样的:保留在NSManagedObject崩溃

[self.navigationController popViewControllerAnimated:NO]; 
MyController *myController = [[MyController alloc] init]; 
myController.managedObject = managedObject; 

很简单吧?但由于某种原因它会在用于设置“managedObject”的合成函数中崩溃。我试着用一些替代的功能是这样的:

- (void) SetManagedObject:(NSManagedObjectSubClass*) obj 
{ 
    if (managedObject) 
     [managedObject release]; 

    managedObject = obj; 
--> [managedObject retain]; 
} 

这崩溃的保留呼叫......我很为难,不知道从哪里开始调试这一点。

回答

1

有几个问题与您的代码:

  • 如果您提供自定义的制定者,你的财产是不是一个合成属性(删除SetManagedObject:和使用@synthesized指令代替)
  • 你定制的setter被释放它保留它之前的对象。所以managedObject可能已经释放当您发送保留消息(这是不速之客)
  • SetManagedObject:有错误的情况下。如果您决定提供自定义设置器,请使用s etManagedObject:
  • 请勿将NS用作自定义子类的前缀(NS由Apple使用)。

我会使用合成属性。删除你的setter代码,声明@property(retain) XYManagedObjectSubClass managedObject;在你的.h文件中并在执行中使用@synthesize

+0

我认为你需要更仔细地阅读这个问题。如果你重新阅读这个问题,你会发现我之前使用了合成函数,但是这个函数崩溃了,所以我故意创建了自己的函数(替换合成函数)来查看它崩溃的位置。原来它在保留上崩溃。如果你看看我的功能,我不释放对象,我释放PREVIOUS对象。有很大的不同。 – rhinoinrepose 2011-05-02 08:15:12

+0

你说得对。我误解了这个问题 - 抱歉。另一个想法是,你正在传递一个过度释放的对象obj。您是否已经尝试使用“僵尸”工具运行您的代码? – 2011-05-02 12:21:41

+0

看来我的“obj”obj没有合适的保留和释放次数。可能是因为我直接访问它,而不是使用self.obj。无论如何,现在修复感谢您的答案。 – rhinoinrepose 2011-05-03 17:16:13

相关问题