Pergunta

Eu estou construindo um aplicativo para iPhone, onde destaco alguns tópicos para fazer um trabalho de longa execução em segundo plano para não pendurar a interface do usuário. Eu entendo que tópicos precisam casos NSAutoreleasePool para gerenciamento de memória. O que eu não estou certo sobre é se o método de rosca chama outro método -? Isso método também precisa de um NSAutoreleasePool

código Exemplo:

- (void)primaryMethod {
    [self performSelectorInBackground:@selector(threadedMethod) withObject:nil];
}

- (void)threadedMethod {
    NSAutoreleasePool *aPool = [[NSAutoreleasePool alloc] init];

    // Some code here

    [self anotherMethod];

    // Maybe more code here

    [aPool drain];
}

- (void)anotherMethod {
    // More code here
}

A razão que eu peço é que estou recebendo erros que os objetos estão sendo autoreleased sem piscina no local, e são "apenas vazando."

Já vi outras questões onde as pessoas não têm piscinas disparo automático no lugar em tudo, e eu entendo por que uma piscina disparo automático é necessário. Estou especialmente interessado em saber se uma piscina disparo automático criado em (neste exemplo) threadedMethod se aplica a objetos criados no anotherMethod.

Foi útil?

Solução

Para responder à sua pergunta, sim, anotherMethod está usando o NSAutoreleasePool você criou na threadedMethod, e qualquer coisa que você autorelease não será liberada quando aPool é liberada / drenado.

Por isso, é improvável que o seu erro é directamente decorrentes deste código (a menos que haja mais acontecendo).

Coloque um ponto de ruptura na _NSAutoreleaseNoPool (adicioná-lo pelo nome na janela de pontos de interrupção) e executar o seu código no depurador e vai parar quando autorelease é chamado sem uma piscina e que deve resolver o problema.

Outras dicas

No seu exemplo, sim, NSAutoreleasePool está realizando através de métodos já que a invocação de [self anotherMethod] é aninhada -(void)threadedMethod dentro.

  • Q:? NSAutoreleasePool transportar todo métodos
  • A: Depende:
    1. Em todo invocações aninhadas, sim.
    2. Em todo invocações irmão, não.

E não importa o que, a instância NSAutoreleasePool si sai do escopo quando o escopo pai vai embora. -em seu exemplo, mesmo no fim de -(void)threadedMethod { } .

O artigo mencionado anteriormente ( http://thegothicparty.com/dev/macos/nsautoreleasepool/ ) é bastante claro sobre isso.

A piscina disparo automático não realizar a anotherMethod. No entanto, quando as extremidades de função com rosca, você deve chamar [a liberação aPool] em vez de [drenagem aPool]. Eles são mais ou menos equivalentes, mas liberação aPool faz com que o NSAutoreleasePool para liberar-se, além de todos os outros objetos na piscina. Quando suas extremidades função rosqueados depois de chamar de drenagem, a piscina disparo automático ainda tem um manter a contagem de +1! As probabilidades são, o objeto "apenas vazando" é aPool!

EDIT:

Jim Puls está certo sobre liberação e dreno sendo equivalente. Os docs da Apple dizem claramente que sejam idênticas, o ambiente não-lixo coletado, e dreno é melhor no caso lixo coletado. A minha culpa por não ler os docs!

Aqui está um artigo que apresenta uma visão geral do NSAutoreleasePools - ele deve ajudar você aponte na direção certa. Desde que há uma pilha virtual de piscinas disparo automático, a um nível superior será usado em todos os lugares dentro do seu app -. Independentemente de onde os objetos estão sendo autoreleased

http://thegothicparty.com/dev/macos/nsautoreleasepool/

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