Vai al contenuto

Problema memoria con CFString e CFUrl


Messaggi raccomandati

Salve a tutti.

Mandando in debug la mia applicazione iOS utilizzando lo strumento Allocations, noto che l'applicazione, col passare del tempo, aumenta la memoria utilizzata.

Proseguendo con la mia indagine, scopro che ci sono oggetti di tipo CFString e CFUrl che aumentano ogni qual volta viene eseguito un suono.

Provando a disabilitare l'esecuzione dei suoni, gli oggetti CFString e CFUrl rimangono stabili. Quindi il problema è nel codice che utilizzo per l'audio, cioè questo:

+ (void) playSound:(NSString *)soundName {
   if (canPlay) {
       NSString *path = [NSString stringWithFormat:@"%@/%@",
                         [[NSBundle mainBundle] resourcePath], soundName];    
       NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO];
       SystemSoundID sound;

       CFURLRef filePathURL = (CFURLRef)filePath;
       AudioServicesCreateSystemSoundID(filePathURL, &sound);
       AudioServicesPlaySystemSound(sound);
   }
}

Ho provato ad aggiungere filePathURL = nil alla fine, ma non cambia nulla... e poi siccome non sono oggetti non posso utilizzare il metodo release.

Quindi, come faccio a rilasciare correttamente gli oggetti CFString e CFUrl in questo codice?

Grazie mille!

Link al commento
Condividi su altri siti

Non ci vedo nulla di sbagliato. Dovrei rileggere un attimo la guida per la memoria, ma quegli oggetti che ti rimangono sono path e filePath. Ma non sei te l'owner di quegli oggetti, quindi è giusto che non devi rilasciarli. Quello che non mi ricordo è se appartengono alla NSAutoreleasePool più vicina, oppure no.

Comunque se vuoi fare una prova prova con questo codice:


+ (void) playSound:(NSString *)soundName {
   if (canPlay) {
       NSString *path = [[NSString alloc] initWithFormat:@"%@/%@",
                         [[NSBundle mainBundle] resourcePath], soundName];    
       NSURL *filePath = [[NSURL alloc] initFileURLWithPath:path isDirectory:NO];
       [path release];
       SystemSoundID sound;

       CFURLRef filePathURL = (CFURLRef)filePath;
       AudioServicesCreateSystemSoundID(filePathURL, &sound);
       [filePath release];
       AudioServicesPlaySystemSound(sound);


   }
}

Link al commento
Condividi su altri siti

Archiviato

Questa discussione è archiviata e chiusa a future risposte.

×
×
  • Crea Nuovo...