参考 Core Data 对象应该是强引用还是弱引用?

3

我认为核心数据(Core Data)不会涉及到任何外部引用,因此不会出现循环引用。最多,核心数据对象会指向其他核心数据对象。

不过,我的想法可能是错误的。

管理对象上下文(ManagedObjectContext)不会对核心数据保持强引用。

这里是否有任何指南?


请澄清:您是否关注上下文内部对象的“内部”保留循环,还是关注代码对上下文内部对象的“外部”引用? - Amin Negm-Awad
内部保留循环在上下文中?那完全由Core Data管理。我关心的是代码对上下文中对象的外部引用。 - Septiadi Agus
2个回答

1

我目前也不确定引用是否应该是强引用还是弱引用。之前的人说应该是强引用,但是我在这里找到了这个:

https://developer.apple.com/library/prerelease/watchos/documentation/Cocoa/Conceptual/CoreData/CoreDataandStoryboards.html#//apple_ref/doc/uid/TP40001075-CH10-SW1

在这个示例代码中,Apple 这样做:
@interface DetailViewController : UIViewController

@property (weak) AAAEmployeeMO *employee;

@end

我们通常会对对象的主键进行强引用,然后使用一个弱属性,在对象为空时进行延迟初始化。就像这样;
@interface MyVC : UIViewController

@property (nonatomic, strong) NSString *objectId; 
@property (nonatomic, weak) SomeObject *myCoolObject; 

@end 

@implementation MyVC 

- (SomeObject *)myCoolObject {
    if (_myCoolObject == nil) {
        _myCoolObject = [SomeObject MR_findFirstByAttribute:@"primaryKey" withValue:self.objectId];
    }
    return _myCoolObject; 
} 

我仍然不确定这是否是正确的做法。请纠正我。


在该链接中,苹果公司声明:“当属性被声明为弱引用时,在对象被删除时它会自动设置为nil。”因此,许多人对此感到困惑,例如:https://dev59.com/wW855IYBdhLWcg3wcz1h。 - malhal

1

这里有任何指南吗?

这是一个链接到Core Data编程指南:对象生命周期管理

它在2014年7月更新,因此可能有新的信息未在您提出此问题时发布。

默认情况下,托管对象和其上下文之间的引用是弱引用。这意味着通常情况下,您不能依赖上下文来确保托管对象实例的寿命,并且您不能依赖托管对象的存在来确保上下文的寿命。换句话说,仅因为您获取了一个对象并不意味着它会一直存在

这个规则的例外是,托管对象上下文对任何更改的对象都保持强引用。

这意味着您对NSManagedObject子类(Core Data对象)的引用应该是强引用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接