如何创建CGImageRefs的可变数组?

时间:2009-09-08 06:39:33

标签: iphone objective-c arrays uikit cgimage

我想保留一个可变的CGImageRefs集合。我是否需要将它们包装在NSValue中,如果是这样,我如何正确包装和打开它们?我可以使用C阵列逃脱吗?如果是这样,我该如何构建它以及如何在以后添加元素?使用UIImages而不是CGImageRefs作为集合的元素是否明显更加昂贵?

3 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:9)

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 ];

希望这有助于某人

答案 2 :(得分: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;