SCDynamicStoreContext的函数指针字段是用来干什么的?
What are the function-pointer fields of an SCDynamicStoreContext for?
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的一个)的各种示例都将retain
, release
和copyDescription
字段设置为NULL
,但我想知道这些字段是用来做什么。
不传递retain
和release
函数的含义是什么?例如,info
对象是NSObject
?
copyDescription
函数的作用是什么?
例如,由SCDynamicStoreCreate()
创建的SCDynamicStore
对象的生存期是不确定的。它将一直存活到完全释放。只要它存在,它就可以调用提供的回调。当它这样做时,它将传递上下文中提供的info
指针。如果不采取措施确保该指针在动态存储对象存在的时间内保持有效,那么info
指针可能会失效。如果你的回调函数在info
指针失效后访问它,它可能会导致崩溃或行为错误。
上下文的retain
和release
函数指针允许框架为您提供一种方法来知道info
指针必须保持有效多长时间。在创建动态存储时,它显然必须是有效的(或NULL
)。而且,只要对retain
函数的任何调用没有被对release
函数的相应调用所平衡,它就必须保持有效。
如果你不提供retain和release函数,那么info
指针必须永久有效,或者至少和动态存储对象一样有效,你有责任确保这一点。这可能有点困难,因为您并不总是知道其他哪些api将保留动态存储对象。只要它的运行循环源被安排在运行循环中,它肯定会保持活动状态,尽管从所有运行循环中删除源并不一定保证它在那一刻将被完全释放。
copyDescription
函数是增强调试输出的一种手段。例如,在某些情况下,框架可能会写入日志消息。它将尝试描述动态存储对象所遇到的情况。为了以一种对客户端最有意义的方式做到这一点,它可以包括来自上下文的info
的描述。如果它没有copyDescription
函数,它能做的最好的事情就是记录指针的值。如果是,那么它就可以写出该函数提供的任何描述。
并非巧合的是,这三个函数指针的签名与CFRetain()
、CFRelease()
和CFCopyDescription()
的签名相匹配。因此,如果info
是一个Core Foundation对象或Cocoa对象(因为NSObject
是免费桥接到CFTypeRef
),那么您可以在上下文中提供这些函数,并且一切都像您期望的那样运行。
- 将结构字段的类型展开为可变模板参数
- 将位字段导出到数组
- 为了方便起见,我应该避免公开私有字段变量吗
- 当字段可以为null时,如何使用C++接口在Avro中写入数据
- 在java中读取c++字节的位字段
- 链接器找不到在虚拟类 c++ 中访问的静态字段的符号
- 私有字段对象与私有继承?
- 声明没有默认构造函数的字段
- C++内存模型和位字段的最大序列
- 声明为无效的变量或字段'...' Ardunio 编译器上的错误
- 如何在QByteArray中放置和检索位字段而不会感到痛苦?
- C++ win32 如何使密码字段可选并启用复制和粘贴?
- 如何通过UDP接收QByteArray并将其解析为位字段结构?
- 仅匹配集合中的某些字段
- 结构字段名称与 GDB 中的 STL 数组冲突
- 如何使用位字段将数据从二进制文件复制到结构中?
- 结构体和类的不同大小(),彼此具有相同的字段类型
- 如何避免在数据结构中包含存储为字段的类?
- 聚合初始化和删除的复制构造函数,也称为不可复制的 obejcts 作为字段
- SCDynamicStoreContext的函数指针字段是用来干什么的?