4

我想保留一个可变的 CGImageRefs 集合。我是否需要将它们包装在 NSValue 中,如果需要,如何正确包装和打开它们?我可以摆脱使用 C 数组吗?如果是这样,我该如何构造它以及以后如何向其中添加元素?使用 UIImages 而不是 CGImageRefs 作为集合的元素是否成本更高?

4

3 回答 3

13

您可以直接将 CGImage 添加到 NSMutableArray。您需要强制转换为 (id) 以避免编译器警告。

CFType 被桥接到 NSObject。您可以发送任何 NSObject 响应的消息到任何 CFType。特别是, -retain 和 -release 正常工作。

于 2009-09-08T07:16:17.673 回答
12

2011:以防万一有人还在看你可以通过使用将 CGImageRef 包装在 NSValues 中

+ (NSValue *)valueWithBytes:(const void *)value objCType:(const char *)type

因此:

CGImageRef cgImage = [self cgImageMethod];
NSValue *cgImageValue = [NSValue valueWithBytes:&cgImage objCType:@encode(CGImageRef)];
[array addObject:cgImageValue];

检索:

CGImageRef retrievedCGImageRef;
[[array objectAtIndex:0] getValue:&retrievedCGImageRef ];

希望这可以帮助某人

于 2011-12-03T16:49:50.667 回答
1

通过 image.CGImage 从 UIImage 中获取CGImageRef可能代价高昂。从文档中:

如果图像数据由于内存限制而被清除,则调用此方法会强制将该数据加载回内存中。重新加载图像数据可能会导致性能损失。

如果您对混合 C++ 和 Objective-C 感到满意,您可以使用std::vector来存储 CGImageRef。将源文件从 .m 重命名为 .mm 并尝试以下操作:

#include <vector>
...
CGImageRef i;
...
std::vector<CGImageRef> images;
images.push_back(i);

如果要将向量保留为 Objective-C 类的成员,则应将其分配在堆上,而不是堆栈上:

头文件:

#include <vector>
using std;

@interface YourInterface : ...
{
   vector<CGImageRef> *images;
}

并在实现文件中:

images = new std::vector<CGImageRef>();
images->push_back(i);
...
//When you're done
delete images;
images = NULL;
于 2009-09-08T06:46:24.727 回答