【发布时间】:2010-11-26 09:54:05
【问题描述】:
我想保留一个可变的 CGImageRef 集合。我是否需要将它们包装在 NSValue 中,如果需要,如何正确包装和打开它们?我可以摆脱使用 C 数组吗?如果是这样,我该如何构造它以及以后如何向其中添加元素?使用 UIImages 而不是 CGImageRefs 作为集合的元素是否成本更高?
【问题讨论】:
标签: iphone objective-c arrays uikit cgimage
我想保留一个可变的 CGImageRef 集合。我是否需要将它们包装在 NSValue 中,如果需要,如何正确包装和打开它们?我可以摆脱使用 C 数组吗?如果是这样,我该如何构造它以及以后如何向其中添加元素?使用 UIImages 而不是 CGImageRefs 作为集合的元素是否成本更高?
【问题讨论】:
标签: iphone objective-c arrays uikit cgimage
您可以直接将CGImage添加到NSMutableArray。您需要强制转换为 (id) 以避免编译器警告。
CFType 被桥接到 NSObject。您可以发送任何 NSObject 响应的消息到任何 CFType。特别是 -retain 和 -release 正常工作。
【讨论】:
CGImageRef img0 = [cgImages objectAtIndex:0]; 时,我得到“从不兼容的指针类型初始化”。
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 ];
希望这对某人有帮助
【讨论】:
通过 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;
【讨论】: