如何在NSMutableArray中存储CGGradientRef

Cyp*_*ian 6 iphone graphics

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

谢谢.

tc.*_*tc. 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开发中心)."桥".

这意味着您可以在大多数情况下将CF类型视为Objective-C对象.Apple并没有特别明显这一点,但除了提到"免费桥接"之外,还有一些东西假设它们是可以互换的.

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

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