cocoa - NSManagedObjectContext 的 userInfo 属性如何工作?

标签 cocoa core-data

在当前 header 中,它声明为:

@property (nonatomic, readonly, strong) NSMutableDictionary *userInfo NS_AVAILABLE(10_7,  5_0);

文档简单地说:

Returns the receiver’s user info.

  1. 上下文的userInfo 的用途是什么? Other Core Data objects拥有可以在托管对象模型中设置的userInfo 字典。这里的情况似乎并非如此。它只是作为一个比使用关联对象更方便的临时存储吗?

  2. 它是否保存到持久存储或通过 NSCoding 保存?

  3. 它是否使用与上下文的托管对象相同的线程模型?

最佳答案

上下文的 userInfo 的用途是什么?

我通过多种方式查看了这个问题,不幸的是没有找到任何明确的信息。

  • -[NSManagedObjectContext userInfo] 上设置符号断点,并运行一组核心数据回归测试来执行大部分公共(public) API。
  • 使用多种逆向工程工具查看了 Core Data 二进制框架。

使用符号断点并没有产生太多效果,尽管我使用的 Xcode 版本可能刚刚超出了它。似乎没有任何东西正在访问公共(public)访问器,但考虑到核心数据的内部结构,这并不令人惊讶。

反汇编该方法得到了一些提示:

void * -[NSManagedObjectContext userInfo](void * self, void * sel) {
    rsi = sel;
    rbx = self;
    if (*(int32_t *)__PF_Threading_Debugging_level != 0x0) {
            __PFAssertSafeMultiThreadedAccess_impl(rbx, rsi);
    }
    rax = *_OBJC_IVAR_$_NSManagedObjectContext._additionalPrivateIvars;
    rax = *(rbx + rax);
    rax = *(rax + 0x30);
    return rax;
}

该方法确实检查并发调试是否处于事件状态,以及该方法是否在并发规则中正确使用(这回答了问题 3)。该方法直接访问私有(private)实例变量_additionalPrivateIvars,Core Data的其他部分从中读取和写入。一些更改跟踪/传播和乐观锁定方法使用此实例变量。例如,-lockObjectStore 写入 NSManagedObjectContext 上的 _additionalPrivateIvars

有点奇怪的是,它是一个只读的 NSMutableDictionary 。您无法设置新的 NSMutableDictionary,但您可以愉快地在其上设置键和值。我能够很轻松地做到这一点:

(lldb) po [[[result managedObjectContext] userInfo] setValue:@"foo" forKey:@"bar"]
0x0000000000000020

(lldb) po [[result managedObjectContext] userInfo]
{
    bar = foo;
}

如果没有 Apple 的更详细指导,我不想在生产代码中执行此操作,因为写入此代码可能很危险。

它是否保存到持久存储或通过 NSCoding?

看起来并非如此,而且这样做也没有多大意义。持久存储对通过协调器访问它们的上下文了解不多,如果 userInfo 字典对存储很重要,则应在原子存储编程指南和增量存储编程中介绍它指南。

它是否使用与上下文的托管对象相同的线程模型?

确实如此,如果并发调试处于事件状态,滥用 -userInfo 将记录断言。

关于cocoa - NSManagedObjectContext 的 userInfo 属性如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26206135/

相关文章:

swift - 以编程方式创建的 NSCollectionView `makeItem` 即使已注册也返回 nil

ios - 核心数据 : Count Number of Consecutive Days

ios swift 4 本地数据库说明

ios - 搜索栏实现不起作用

ios - 删除核心数据中的对象

macos - 如何在 super View 中移动 subview

objective-c - 使用 NSArray 子类时出现 "-[NSArray count] only defined for abstract class"异常

objective-c - NSTreeController 添加 :method not adding "after the current selection"

objective-c - 如何确定/控制托管对象模型 (.mom) 文件的存储位置?

ios - 核心数据删除问题