在ViewControllers之间传递NSManagedObjects是个坏主意吗?我有一个iPad应用程序,我似乎遇到随机坏访问崩溃和sigbart错误。
这些NSManageObjects来自CoreData,我想知道它们是否有时会丢失内存而导致这种情况。我希望将它们从控制器传递给控制器,以避免在每个viewcontroller上进行获取。
答案 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
将其分配给属性,那么内存管理应该没问题。