gpt4 book ai didi

iphone - 如何在 NSMutableArray 中存储 CGGradientRef

转载 作者:行者123 更新时间:2023-12-03 18:42:32 28 4
gpt4 key购买 nike

我在将 CGGradientRef 存储在 NSMutableArray 中时遇到问题。我必须用什么包装它才能将其存储在数组中以及如何解开它。

谢谢。

最佳答案

您不必将其包裹在任何东西中。只需将其转换到 id并将其添加到数组中。您可以对从 CFType 派生的任何 CoreFoundation 类型(松散地以“Ref”结尾的任何类型)执行此操作。

或者,您可以将 NSMutableArray* 转换为 CFMutableArrayRef 并调用 CFArrayAppendValue()。这不再是类型安全的;它调用创建数组时指定的保留/释放回调。 (一个值得注意的异常(exception)是 -[NSDictionary setValue:forKey:] ,它复制键,而相应的 CFDictionary 函数则不复制键。有时,有一个由“可变”对象(例如 NSURLConnection,带有数据)作为键的字典会很好。 -就值而言);只要不违反哈希值不改变的要求,您就是安全的。)

CoreFoundation 类型是类似 OO 的类型,可以在“普通”C 中使用。使用一些巧妙的魔法(Apple 可以做到这一点,因为他们同时编写 CF 和 ObjC 运行时)、NSString、NSArray 和 NSDictionary 等类型的实例(默认情况下)是 CFString、CFArray 和 CFDictionary 的“真正”实例。 CF 类型位于类型层次结构中,其根为 CFType ;值得注意的方法有 CFRetain、CFRelease、CFEqual、CFHash 和 CFCopyDescription。这些大致对应于 -retain、-release、-isEqual:、-hash 和 -description(除了 -description 额外自动释放,并且它们对 NULL/nil 有不同的处理)。 Apple 将此称为“免费桥接”或“可互换数据类型”(不过,Mac 开发中心已不再提供 IDT 文章)。 Ridiculousfish 有一篇好文章,名为"Bridge" .

这意味着在大多数情况下,您可以将 CF 类型视为 Objective-C 对象。苹果并没有特别明显地表明这一点,但除了所有提到的“免费桥接”之外,还有一些内容假设它们是可以互换的。

  • 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 .

关于iphone - 如何在 NSMutableArray 中存储 CGGradientRef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4240481/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com