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?

È stato utile?

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)

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