Io ci provo, magari becco il guru che mi risolve il dilemma.
Sto lavorando in objective-c con un pizzico di c liscio per un progetto di visione artificiale... Dettagli a parte, al momento ho un unico grosso problema. L'esempio di riferimento è il CIVideoDemoGL (http://developer.apple.com/samplecod...oGL/index.html) : unica NSOpenGLView, qualche pulsante, pochi fronzoli... Il metodo che ho modificato per integrare il pezzo di codice che ho sviluppato è il renderCurrentFrame che, di suo, crea una ciimage dal buffer di corevideo mediante convenience method, la lavora tramite un CGContext e da questo crea una ciimage in uscita (anch’essa tramite convenience method) da disegnare nel CIContext definito:
Codice:
- (void)renderCurrentFrame
{
// bla bla bla
if(currentFrame)
{
// bla bla bla
inputImage = [CIImage imageWithCVImageBuffer:currentFrame];
// bla bla bla
// richiamo del metodo incriminato, di cui parlo fra un po'
// creazione dell'outputImage: bla bla bla
// visualizzazione dell'immagine: bla bla bla
}
QTVisualContextTask(qtVisualContext);
} All’interno di questo metodo, come ho accennato sopra, richiamo un metodo di una classe mia che prende in ingresso la ciimage precedentemente menzionata e spara in output un vettore di NSRect:
Codice:
-(NSMutableArray*) foundFaces:(CIImage*)image
{
[image retain]; // il retainCount qui vale 2...
// bla bla bla
VJIntegralImage *tempImage = [[VJIntegralImage alloc] init];
[tempImage doTheMagicWithImage:image];
[tempImage release];
// bla bla bla
[image release]; // e qui torna a valere 2
return faces;
} Come si può vedere, all’interno richiamo infine un altro metodo di una classe mia, che prende in ingresso la solita ciimage e alla fin fine (anche se non si vede) spara fuori in output una matrice di float. Sta matrice viene prodotta lavorando in c sulla bitmap dell’immagine in ingresso. Il metodo relativo è il seguente:
Codice:
-(BOOL)doTheMagicWithImage:(CIImage*)image
{
[image retain]; // retainCount == 3
// creo una NSImage a partire dalla ciimage, sfruttando l'NSCIImageRep ottenuta dalla CIImage
inputNSCIImageRep = [[NSCIImageRep alloc] initWithCIImage:localCIImage];
localNSImage = [[NSImage alloc] initWithSize:NSMakeSize(w, h)];
[localNSImage addRepresentation:inputNSCIImageRep];
// estraggo l’NSBitmapImageRep dall’NSImage
inputImageRep = [[NSBitmapImageRep alloc] initWithData:[localNSImage TIFFRepresentation]];
[image release];
} Nel dealloc infine ci sono i release dei vari oggetti intermedi, che riportano appunto il retainCount della ciimage a 2.
Morale della favola. Utilizzando il MallocDebug, appare un memory leak sostanzioso in corrispondenza della chiamata di TIFFRepresentation... Il programma, infatti, ad ogni tick dell’activity monitor consuma qualcosa come 10-15mb così, in simpatia. Non ci sono altri leak importanti tranne questo: quelli che c’erano li ho già tolti con successo.
Dalle mie analisi, risulta un problema sulla deallocazione della ciimage. Se infatti arrivo al pareggio dei retainCount, ossia se termino renderCurrentFrame con retainCount pari a 1, il programma crusha con un messaggio objc_msgSend (tipico appunto di quando non trova l’oggetto a cui mandare il messaggio... quale non si sa). Se evito di fare un release sulla ciimage (quindi facendola terminare con retainCount == 2) il programma non crusha ma consuma quei 15 mb esponenziali di memoria di cui parlavo. Infine lo stesso programma, senza la parte che ho aggiunto io, invece scorre liscio come l’olio senza memory leak, con la ciimage che arriva alla fine di renderCurrentFrame con retainCount = 1. Tramite tagli successivi di codice, sono perciò arrivato ad isolare il problema, appunto riguardante inputImageRep e la chiamata a TIFFRepresentation.
Chiedo dunque se qualcuno mi sa spiegare questo comportamento. Ho cominciato da poco a programmare in obj-c, ma mi pare d'aver seguito alla lettera i consigli della nonna riguardanti la gestione della memoria. Non capisco insomma perchè l'accesso alla bitmaprep gli provochi questo squilibrio ormonale: in fondo è semplicemente un puntatore alla bitmapdata dell'immagine, e in quanto tale dovrebbe essere deallocata alla deallocazione dell'immagine... perchè non è così?
PS: spero di essere stato sufficientemente chiaro, in caso contrario chiedetemi pure...
il programma che devo rinstallare é artlantis render 3 ma é sicuro perché lo...
problemi con usb e batteria