Qual é a diferença entre liberar e autoreleasing?
Ainda Tenho uma compreensão pouco clara sobre a libertação e auto-libertação. Qual é a diferença entre ambos? Tenho este código. Para a ligação ao facebook. Às vezes, quando vou ao login do Facebook, duvido que seja porque não liberto bem o objecto.? Obrigado por qualquer ajuda.
if (_session.isConnected) {
[_session logout];
} else {
FBLoginDialog* dialog = [[[FBLoginDialog alloc] initWithSession:_session] autorelease];
[dialog show];
}
4 answers
-retain
. Um objeto indica que ele quer liberar esse interesse, enviando a outra instância a -release
mensagem. Se o número de objetos que têm 'retido' e o interesse de propriedade em um objeto cair para 0 (ou seja, quando a última das instâncias proprietárias envia uma mensagem -release
), a instância com uma contagem 0 retain é desallocada.
Às vezes é conveniente dizer: "quero que esta instância seja lançada no futuro". Esse é o propósito de -autorelease
. Enviar uma mensagem -autorelease
adiciona o receptor ao actual NSAutoreleasePool
. Quando a piscina é drenada, envia uma mensagem a todos os instâncias na piscina. Um NSAutoreleasePool
é criado automaticamente no início de cada iteração do ciclo de execução de cada thread e drenado no final dessa iteração. Assim, você pode fazer algo assim em um método:
- (id)myMethod {
return [[[MyObject alloc] init] autorelease];
}
O chamador deste método recuperará uma instância que pode, se quiser mantê-la. Se não a conservarem, ficará por cá pelo menos até que a piscina da auto-estrada esteja drenada:
- (void)someOtherMethod {
...
id instance = [obj myMethod];
... // do more with instance, knowing that it won't be dealloc'd until after someOtherMethod returns
}
Você usa a auto-correcção quando quer manter a variável, mas não quer criar uma fuga de memória. Você usa o release quando você não precisa mais da variável.
Amostra:
- (NSNumber *)return5 {
NSNumber * result = [[NSNumber alloc]initWitnInt: 5];
[result autorelease];
return result;
}
Porque é que usamos a auto-estrada lá?
Se usarmos [lançamento do resultado] em vez disso, o resultado variável será destruído nesse momento. O que significa que o valor devolvido será lixo.
Se não libertarmos nada, a variável result
será mantida para sempre a incorrer em fuga de memória.
De qualquer forma, usa o arco.
Discussão de Fundo:
O Objectivo-c é contado de referência, pelo que os objectos são eliminados quando a contagem de referência atinge 0. a libertação reduz a contagem de referência imediatamente, a auto-correcção reduz-a quando o conjunto de auto-regulação for estourado
Quando utilizar:
Usar a auto-correcção ao atribuir o objecto se
- não precisa dele após a função actual [[10]ele será retirado por algum outro objet/função e será liberado por um mais tarde pelo código de retenção
- quando a lógica da função atual é complicada, então você teria que enviar a liberação em uma dúzia de lugares diferentes antes de fazer um retorno
Utilizar a versão "manual"
- para reverter uma retenção anterior (no caso de estar a implementar uma biblioteca)
- Se precisar de um controlo preciso dos objectos Libertadores (por exemplo, eles usam muita memória ou o conjunto de auto-iluminação não será desligado durante algum tempo) {[[11]}
- Leia o Guia de programação de gerenciamento de memória para o cacau, como sugerido por Barry, e executar seu código com instrumentos (zumbis e vazamentos), muitas vezes para pegar qualquer e quase todos os erros de gerenciamento de memória.
Erik
O método da auto-correcção, definido por: NSObject, marca o receptor para mais tarde lancar. Ao auto-suavizar um objecto-isto é, enviando-lhe um mensagem de auto-correcção-declara que: você não quer possuir o objeto além do âmbito em que Você enviou auto-correcção.
Também:
O método da auto-correcção permite todos os objectos para usar outros objectos sem preocupação com a eliminação de o.