CGImageRefsの可変コレクションを保持したいと思います。それらをNSValueでラップする必要がありますか?もしそうなら、どのようにそれらを適切にラップおよびアンラップしますか?C配列の使用をやめることはできますか?もしそうなら、どのようにそれを構築し、どのように後で要素を追加するのですか?コレクションの要素としてCGImageRefsの代わりにUIImagesを使用する方がはるかにコストがかかりますか?
3 に答える
CGImageをNSMutableArrayに直接追加できます。コンパイラの警告を回避するには、(id)にキャストする必要があります。
CFTypeはNSObjectにブリッジされます。NSObjectが応答する任意のメッセージを任意のCFTypeに送信できます。特に、-retainと-releaseは通常どおり機能します。
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;