IPHONE: domanda sul rilascio di una variabile
-
06-07-2019 - |
Domanda
Considera questo pseudo codice:
// an image is initialized
UIImage *imagePX = [[UIImage alloc]initWithContentsOfFile:... bla bla
imagePX = [self rotateImage:imagePX]; //A
[self doStuff:imagePX]; //B
Quindi ho il metodo rotateImage:
- (UIImage*) rotateImage:(UIImage*)source {
... rotate the image... draw on context...
[source drawInRect... bla bla
...
UIImage *rotatedImage = UIGraphicsGetImageFromCurrentImageContext();
return rotatedImage;
}
La mia domanda è: imagePX non è mai stato rilasciato. Quando l'immagine viene passata al metodo RotateImage, ho pensato di poterlo semplicemente rilasciare, dopo averlo usato sul comando [source drawInRect ...], poiché avrei restituito un'immagine ruotata sul metodo, ma se lo facessi, il programma andrà in crash, perché la variabile imagePX dovrebbe esistere in modo che la riga A possa valutare.
L'altro mio problema è che l'immagine verrà inoltrata su B a un'altra routine. Quindi, qual è il modo migliore per farlo funzionare senza perdere traccia di imagePX e perdite?
Qual è l'approccio migliore?
Soluzione
Invece di
[[UIImage alloc]initWithContentsOfFile:... bla bla
Usa
[UIImage imageWithContentsOfFile:...bla bla
Quest'ultimo verrà rilasciato automaticamente.
Altri suggerimenti
Non è necessario allocare un'istanza di UIImage. imageWithContentsOfFile
è un metodo statico e può essere chiamato sulla classe stessa.
Poiché imageWithContentsOfFile
non include i termini alloc
, new
o copy
l'oggetto restituito (per convenzione ) non viene mantenuto e verrà rilasciato automaticamente al primo scarico del pool di rilascio automatico.
Al contrario, se mai ti imbatti in una situazione simile in cui non riesci a capire perché stai ricevendo errori EXC_BAD_ACCESS quando provi ad accedere a questo oggetto, è probabile che sia stato rilasciato troppo presto. In questi casi, ti consigliamo di effettuare una conservazione / rilascio manuale nell'ambito di questa classe.
Che dire di [UIImage imageNamed: @ " "]? Nessuna allocazione, nessuna necessità di rilasciare)