繁体   English   中英

如何在NSMutableArray中存储CGGradientRef

[英]How to store CGGradientRef in NSMutableArray

我在NSMutableArray中存储CGGradientRef的任务有问题。 我需要包装它以将其存储在数组中以及将其解包的内容。

谢谢。

你不必将它包装在任何东西中。 只需将其转换为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并没有特别明显这一点,但除了提到“免费桥接”之外,还有一些东西认为它们是可以互换的。

  • NSMakeCollectable()接受CFTypeRef并返回id(并启用垃圾收集,这在iOS上无关紧要,但在Mac OS 10.5+上非常相关)。
  • @property (nonatomic, retain) __attribute__((NSObject)) ABAddressBookRef foo; 这实际上意味着“发送它-retain和-release就好像它是一个Objective-C实例”。
  • CALayer.contents属性具有类型id但它支持的唯一记录的是CGImageRef(它还支持CABackingStore,这是-drawRect:绘制的)。

您可以做的其他有趣的事情包括定义CFAutorelease

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM