在ViewControllers之间传递NSManagedObjects - 随机错误访问错误

时间:2010-12-01 23:56:17

标签: iphone objective-c ipad

在ViewControllers之间传递NSManagedObjects是个坏主意吗?我有一个iPad应用程序,我似乎遇到随机坏访问崩溃和sigbart错误。

这些NSManageObjects来自CoreData,我想知道它们是否有时会丢失内存而导致这种情况。我希望将它们从控制器传递给控制器​​,以避免在每个viewcontroller上进行获取。

3 个答案:

答案 0 :(得分:6)

听起来这是一个糟糕的对象内存分配实践。只要您没有多线程化您的应用程序并且只有一个managedObjectContext(典型),您可以在VeiwControllers之间传递这些NSManagedObjects没问题。

可能发生的事情是你将引用从一个ViewController传递给另一个ViewController,而没有使用retain消息增加它的引用计数。这可能会有点冒险。

我建议您在ViewControllers上使用retain属性,例如

@property (nonatomic, retain) NSManagedObject *yourObject;

然后,当您获得托管对象时,请保持这样:

self.yourObject = ...;

...当你想将它传递给另一个视图控制器时:

otherViewController.yourObject = ...;

它将负责为您设置保留/释放。

答案 1 :(得分:2)

听起来你没有遵循正确的内存管理语义。您可能需要阅读Memory Management Programming Guide。如果您遵循正确的内存管理规则,那么根本没有理由不安全。你不能在线程之间传递NSManagedObjects,但只要你总是在与上下文相同的线程上(对于作为主线程的视图控制器),那么应该没有问题。

答案 2 :(得分:1)

确保在将NSManagedObject上下文传递给新的视图控制器时不保留NSManagedObject上下文。处理此问题的最佳方法是使用

简单地访问managedObjectContext的AppDelegate实例
[[[UIApplication sharedApplication] delegate] managedObjectContext];

如果再次使用retain将其分配给属性,那么内存管理应该没问题。