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