【问题标题】:Should Reference to Core Data Object be Strong or Weak?对核心数据对象的引用应该是强还是弱?
【发布时间】:2013-05-04 23:01:31
【问题描述】:

我想不出核心数据指的是核心数据之外的任何东西。所以不可能有引用循环。最多核心数据对象指向另一个核心数据对象。

但是,我可能错了。

Managedobjectcontext 不持有对核心数据的强引用。

这里有指南吗?

【问题讨论】:

  • 请澄清:您是否关注上下文中对象的“内部”保留循环,或者您是否关注代码对上下文中对象的“外部”引用?
  • 上下文中的内部保留周期?这完全由核心数据管理。我关心的是我的代码对上下文中对象的外部引用。

标签: objective-c core-data


【解决方案1】:

这里有指南吗?

这是Core Data Programming Guide: Object Lifetime Management的链接。

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

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

此规则的例外是托管对象上下文维护对任何更改的强引用

这意味着您对 NSManagedObject 子类(核心数据对象)的引用应该是 strong

【讨论】:

    【解决方案2】:

    我目前也不确定引用应该是强还是弱。之前的大佬说要强,后来我发现了这个:

    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
    

    我们倾向于做的是对对象的主键有一个强引用,然后是一个弱属性,如果对象为 nil 则进行延迟初始化。像这样;

    @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; 
    } 
    

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

    【讨论】:

    • 在该链接中,Apple 声明“当属性被声明为弱时,它会在对象被删除时自动设置为 nil。”很多人为此而苦苦挣扎,例如stackoverflow.com/questions/4340445/…
    猜你喜欢
    • 2011-02-25
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 2015-06-07
    相关资源
    最近更新 更多