在本书
Learning Core Data for iOS中,作者创建了几个UIViewControllers,每个UIViewControllers都有一个引用NSManagedObjectID的属性.
在例子中,
@interface LocationAtShopViewController : UIViewController @property (strong,nonatomic) NSManagedObjectID *selectedObjectID; // ... other properties and methods @end
通过这种方式,他能够将NSManagedObjectID从一个控制器传递到另一个控制器,并使用NSManagedObjectContext的existingObjectWithID:error:方法检索关联的NSManagedObject对象.
此外,他没有直接设置NSManagedObject对象(即使他已经有一个变量引用),也没有长时间保持对NSManagedObject对象的引用(相反,他在每个需要它的方法中检索它) ).
是否不安全(即在某些情况下会导致崩溃或导致意外行为)通过属性引用直接在控制器之间传递NSManagedObject,或者只是在控制器上保留对它的引用?
在例子中,nonatomic) LocationAtShop *locationAtShop; // ... other properties and methods @end
假设使用了单个共享NSManagedObjectContext,因此忽略了在多个上下文之间传递所导致的问题,这通常是不安全的.
解决方法
没有理由避免直接使用托管对象,前提是:
>您只将托管对象与单个托管对象上下文一起使用,并且
>你要么
>只在单个线程或队列上使用托管对象,或者
>确保在处理其他队列时使用performBlock或performBlockAndWait.
仅保留对象ID可能不太容易出错,因为它会使意外混淆上下文或队列变得更加困难.对于经验不足的开发人员来说,这可能是一个更好的主意,因此他们不太可能搞砸了.但保持对象本身肯定没有错,甚至特别危险.