1

SCDynamicStoreContext定义如下(版本 0):

typedef struct {
      CFIndex        version;
      void *         info;
      const void *   (*retain)(const void *info);
      void           (*release)(const void *info);
      CFStringRef    (*copyDescription)(const void *info);
} SCDynamicStoreContext;

我见过的关于如何初始化SCDynamicStoreContext(包括来自 Apple的)的各种示例都将retainreleasecopyDescription字段设置为NULL,但我想知道这些字段的用途。

例如retain当对象是_releaseinfoNSObject是什么?

copyDescription函数是用来做什么的?

4

1 回答 1

4

SCDynamicStore例如,由创建的对象的生命周期SCDynamicStoreCreate()是不确定的。它会一直存活到完全释放。只要它存在,它就可以调用提供的回调。当它这样做时,它将传递info上下文中提供的指针。如果您不采取措施确保该指针在动态存储对象存在期间保持有效,则该info指针可能会变为无效。info如果您的回调在指针变为无效后访问指针,则可能会导致崩溃或行为异常。

上下文的retainrelease函数指针允许框架为您提供一种方法来了解info指针必须保持有效多长时间。它显然必须NULL在创​​建动态存储时有效(或)。此外,只要对该retain函数的任何调用未被相应的release函数调用平衡,它就必须保持有效。

如果您不提供保留和释放功能,则info指针必须永久保持有效,或者至少与动态存储对象一样长,并且您有责任确保这一点。这可能有点困难,因为您并不总是知道其他哪些 API 将保留动态存储对象。只要它的运行循环源被安排在一个运行循环上,它肯定会保持活动状态,尽管从所有运行循环中删除源并不一定保证它会在那时完全释放。

copyDescription功能是增强调试输出的一种手段。例如,在某些情况下,框架可能会写入日志消息。它将尝试描述遇到这种情况的动态存储对象。要以对客户最有意义的方式做到这一点,它可以包括info对上下文的描述。如果它没有copyDescription函数,它所能做的最好的就是记录指针值。如果是这样,那么它可以编写该函数提供的任何描述。

并非巧合的是,三个函数指针的签名与 、 和 的CFRetain()签名CFRelease()匹配CFCopyDescription()。因此,如果info是 Core Foundation 对象或 Cocoa 对象(因为NSObject免费桥接到CFTypeRef),那么您可以在上下文中提供这些函数,并且一切都按照您的预期运行。

于 2014-07-20T18:31:17.207 回答