IPHONE: Pergunta sobre a liberação de uma variável
-
06-07-2019 - |
Pergunta
Considere este código pseudo:
// an image is initialized
UIImage *imagePX = [[UIImage alloc]initWithContentsOfFile:... bla bla
imagePX = [self rotateImage:imagePX]; //A
[self doStuff:imagePX]; //B
Então eu tenho o método rotateImage:
- (UIImage*) rotateImage:(UIImage*)source {
... rotate the image... draw on context...
[source drawInRect... bla bla
...
UIImage *rotatedImage = UIGraphicsGetImageFromCurrentImageContext();
return rotatedImage;
}
A minha pergunta é: imagePX nunca foi lançado. Como a imagem é passado para o método RotateImage, eu pensei que eu poderia simplesmente liberá-lo, depois de usá-lo no comando [fonte drawInRect ...], como eu gostaria de voltar a rotatedImage no método, mas se eu fizer isso, o programa irá falhar, porque a variável imagePX deve existir para a linha a pode avaliar.
Meu outro problema é que a imagem será encaminhada em B para outra rotina. Então, qual é a melhor maneira de fazê-lo funcionar sem perder de vista imagePX e vazando?
Qual é a melhor abordagem?
Solução
Em vez de
[[UIImage alloc]initWithContentsOfFile:... bla bla
Use
[UIImage imageWithContentsOfFile:...bla bla
Este último será autoreleased.
Outras dicas
Não há necessidade de alocar uma instância de UIImage. imageWithContentsOfFile
é um método estático, e pode ser chamado na própria classe.
Desde imageWithContentsOfFile
não inclui o alloc
termos, new
, ou copy
o objeto retornado (por convenção) não é mantida, e serão autoreleased no primeiro drenagem da piscina disparo automático.
Por outro lado, se você já se deparou com uma situação semelhante, onde você não pode descobrir por que você está recebendo erros EXC_BAD_ACCESS ao tentar acessar este objeto, é provável que foi lançado muito em breve. Nesses casos, você vai querer fazer um manual de reter / release no âmbito desta classe.
E [UIImage imageNamed: @ ""]? Sem alloc, não há necessidade de liberação)