Domanda

Ho usato

NSMutableData* mutableData = [NSMutableData dataWithLength: someLength];
void* bitmapData = [mutableData mutableBytes];
CGContextRef context = CGBitmapContextCreate(bitmapData,...);
// ...use context
CGContextRelease(context);

Ho una piscina per autolesi in atto, ma quando lo guardo negli strumenti, mutableData non sembra essere traffico.
Ho pensato di usare alloc/init come sotto, ma non sono sicuro se invio release spurgerebbe bitmapData anche.

NSMutableData* mutableData = [[NSMutableData alloc] initWithLength: someLength];
void* bitmapData = [mutableData mutableBytes];
[mutableData release];
//...

Qual è il modo corretto di usare NSMutableData qui?

Ho pensato di usare NSMutableData invece di malloc() e free() Sarebbe conveniente perché sarà autorizzato. Ma ora non sono sicuro che sia vero.

È stato utile?

Soluzione

Quando dici mutableData non sembra essere traffico, intendi al punto di CGContextRelease(), o vuoi dire che non si occupa mai e perde ogni volta che lo esegui?

Nel tuo primo esempio, non ti aspetteresti mutableData Trattare fino a quando il pool di autolease non si esaurisce (generalmente alla fine del circuito degli eventi), perché hai usato -dataWithLength:. Nel tuo secondo esempio, è indefinito se mutableData sarebbe stato rilasciato. La chiamata a -mutableBytes potrebbe applicare un mantenimento e un autorelease per garantire che il puntatore sia valido per il resto del ciclo di eventi (questo è abbastanza comune con questo tipo di metodi), ma i documenti non dicono, quindi il tuo secondo esempio è un comportamento indefinito se si utilizza bitmapData dopo.

Ora se mutableData Perdite, allora probabilmente lo stai prendendo in modo eccessivo da qualche altra parte.

Altri suggerimenti

Chiedere un'istanza di NSMUtabletata per i suoi mutabili restituisce semplicemente un puntatore al buffer esistente (già allocato) che gestisce per te. Non ha alcun effetto sulla memoria dal punto di vista della gestione.

Quindi, nel tuo primo esempio, il fatto che Mutableta non sembra essere traffico quando lo guarda negli strumenti potrebbe essere correlato all'ambiente del pool di autolelease in quel momento. Il codice che utilizza mutabletata in questo modo ha in atto un NSAutoReleSepool? Vedi avvertimenti nella console come "Autorelease chiamato senza piscina in atto; solo perdite"? In tal caso, devi solo avvolgere il codice in:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// bitmap drawing code here
[pool drain];

Nel secondo campione, è possibile utilizzare Alloc/init sull'istanza NSMUTABLABABLATATA, ma dovresti rilasciarlo dopo aver finito usando il puntatore che ottieni dai mutabili. Il puntatore indicherà la memoria di Deallocated (Freed) dopo aver chiamato il rilascio e l'accesso a esso comporterà il temuto EXC_BAD_ACCESS.

Inoltre, usare Malloc/Free sarebbe probabilmente la mia prima scelta qui, dal momento che sarai molto esplicito su come e quando la memoria viene assegnata e liberata. NSMUTABLABABATATA + AutoRelease non ti sta davvero acquistando nulla tranne un po 'di spese generali, se non si utilizza l'oggetto per nient'altro.

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