ios – 对NSManagedObject的属性引用是不安全的吗?

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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...