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?

Foi útil?

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)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top