Domanda

Voglio mantenere un mutevole collezione di CGImageRefs.Ho bisogno di inserirli in NSValue, e se è così come faccio avvolgere e li scartano correttamente?Posso ottenere via con l'utilizzo di una matrice C?Se è così come faccio a costruirlo e come faccio ad aggiungere elementi a più tardi?È significativamente più costoso di usare UIImages invece di CGImageRefs come gli elementi della collezione?

È stato utile?

Soluzione

Come la CGImageRef fuori di un UIImage tramite image.CGImage può essere costoso. Dalla documentazione:

  

Se l'immagine è stata spurgata a causa di vincoli di memoria, invocando questo metodo forze che dati a essere caricato in memoria. Il caricamento dei dati di immagine può incorrere in una riduzione delle prestazioni.

Se ti trovi bene con la miscelazione C ++ e Objective-C, è possibile utilizzare un std :: vector per la memorizzazione del CGImageRef. Rinominare il file sorgente da .m a .MM e provare questo:

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

Se si desidera mantenere il vettore come un membro di una classe Objective-C, è necessario allocare sul mucchio, non lo stack:

File di intestazione:

#include <vector>
using std;

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

e nel file di implementazione:

images = new std::vector<CGImageRef>();
images->push_back(i);
...
//When you're done
delete images;
images = NULL;

Altri suggerimenti

È possibile aggiungere direttamente CGImage a NSMutableArray. Avrete bisogno di lanciare a (id) per evitare avvisi del compilatore.

CFType è colmato a NSObject. È possibile inviare qualsiasi messaggio NSObject risponde a qualsiasi CFType. In particolare, -retain e -release lavoro come normale.

2011:nel caso in cui qualcuno è ancora alla ricerca Si può avvolgere CGImageRef in NSValues utilizzando

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

quindi:

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

da recuperare:

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

spero che questo aiuta qualcuno

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top