我遇到了在NSMutableArray中存储CGGradientRef的任务的问题。 我需要包装它以将其存储在数组中以及将其解包的内容。
感谢。
答案 0 :(得分:12)
您不必将其包装在任何东西中。只需将其强制转换为id
并将其添加到数组中。您可以为从CFType派生的任何CoreFoundation类型执行此操作(松散地以“Ref”结尾)。
或者,您可以将NSMutableArray *强制转换为CFMutableArrayRef并调用CFArrayAppendValue()。这不再是类型安全的;它调用创建数组时指定的retain / release回调。 (一个值得注意的异常例外是 - [NSDictionary setValue:forKey:]复制键,而相应的CFDictionary函数则没有。有时候,一个字典由一个“可变”对象键入(例如NSURLConnection,带有数据)很好-far as values);只要你没有违反散列没有改变的要求,你就是安全的。)
CoreFoundation类型是类似于OO的类型,可以在“普通”C中使用。使用一些聪明的魔法(Apple可以这样做,因为它们同时编写CF和ObjC运行时),NSString,NSArray和NSDictionary等类型的实例是(默认情况下)CFString,CFArray和CFDictionary的“真正”实例。 CF类型属于类型层次结构,其根目录为CFType;值得注意的方法是CFRetain,CFRelease,CFEqual,CFHash和CFCopyDescription。这些松散地对应于-retain,-release,-isEqual:, - hal和-description(除了-description另外自动释放,并且它们具有不同的NULL / nil处理)。 Apple将此称为“免费桥接”或“可互换数据类型”(虽然IDT文章不再出现在Mac开发中心)。 Ridiculousfish有一篇名为"Bridge"的好文章。
这意味着您可以在很大程度上将CF类型视为Objective-C对象。 Apple并没有特别明显这一点,但除了提及“免费桥接”之外,还有一些东西假设它们是可以互换的。
@property (nonatomic, retain) __attribute__((NSObject)) ABAddressBookRef foo;
这样的东西,实际上意味着“发送它-retain和-release就好像它是一个Objective-C实例”。id
,但它支持的唯一文件是CGImageRef(它还支持CABackingStore,这是-drawRect:绘制的内容)。您可以做的其他有趣的事情包括定义CFAutorelease。