NSManagedObject的属性引用是否不安全?

时间:2013-12-18 23:03:09

标签: ios core-data

在书籍Learning Core Data for iOS中,作者创建了多个UIViewControllers,每个NSManagedObjectID都有一个引用@interface LocationAtShopViewController : UIViewController @property (strong, nonatomic) NSManagedObjectID *selectedObjectID; // ... other properties and methods @end 的属性。

例如,

NSManagedObjectID

通过这种方式,他可以将NSManagedObject从一个控制器传递到另一个控制器,并使用NSManagedObjectContext的{​​{1}}方法检索关联的existingObjectWithID:error:对象。

此外,他没有 永远 直接设置NSManagedObject对象(即使他已经有一个变量引用),也没有保留对NSManagedObject对象的引用很长(相反,他会在他需要的每个方法中检索它)。

不安全(即在某些情况下会导致崩溃或导致意外行为)通过属性引用直接在控制器之间传递NSManagedObject,或者只是保留对它的引用在控制器上?

例如,

@interface LocationAtShopViewController : UIViewController   
@property (strong, nonatomic) LocationAtShop *locationAtShop;
// ... other properties and methods
@end

假设使用,则使用共享NSManagedObjectContext,因此请忽略因在多个上下文之间传递而导致的问题,这通常不安全。

2 个答案:

答案 0 :(得分:8)

没有理由避免直接使用托管对象,前提是:

  • 您只能将托管对象与单个托管对象上下文一起使用,并且
  • 你要么
    • 仅在单个线程或队列上使用托管对象,或
    • 确保在处理其他队列时使用performBlockperformBlockAndWait

仅保留对象ID可能不太容易出错,因为它会使意外混淆上下文或队列变得更加困难。对于经验不足的开发人员来说,这可能是一个更好的主意,因此他们不太可能搞砸了。但保持对象本身肯定没有错,甚至特别危险。

答案 1 :(得分:5)

安全吗?

是的,它是安全的,有一些警告:

根据Tom Harrington的回答,一般NSManagedObject作为属性存储在控制器上是安全的。

但是,有些情况会导致问题。值得注意的是,

如果删除引用的NSManagedObject并保存其上下文,则必须将该属性明确设置为nil。

如果 将属性显式设置为nil,则下次尝试访问对象的属性时,会导致{ {1}}崩溃。

为什么学习iOS核心数据的作者传递并存储NSManagedObjectID而不是NSManagedObject?

可能的原因可能包括:

如果不是将CoreData could not fulfill a fault存储为存储NSManagedObject的属性,而是不必过多担心要删除的对象。

这是因为NSManagedObjectID的方法NSManagedObjectContext会在existingObjectWithID:error:的情况下返回nil

所以, 更安全 the object cannot be fetched, or does not exist, or cannot be faulted存储为属性,而不是存储NSManagedObjectID,如果对象的删除是可能的。