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];
    }
Author: zoul, 2010-01-16

4 answers

O Guia de programação de gestão de memória para o cacau em breve será o teu melhor amigo. Em resumo, as instâncias objeto no cacau são gerenciadas pela memória usando a contagem de referência (a menos que, claro, você esteja usando a coleta de lixo no OS X). Um objecto indica que quer "manter" um interesse de propriedade numa outra instância--impedir que seja descalocado--enviando-lhe uma mensagem -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

}
 21
Author: Barry Wark, 2016-10-05 20:43:21
Libertar significa libertar isso imediatamente. A auto-correcção significa que deseja que a variável seja lançada no próximo conjunto de auto-correcção.

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.

Podemos dizer a todos os chamadores da função para libertarem o resultado, mas isso seria uma dor de cabeça e propenso a erros. Então usamos a auto-via. Marcamos a variável a ser lançada no próximo pool de auto-correcção. Basicamente marcamos a variável a ser lançada perto do alloc. Assim, o mantra alloc é emparelhado com a liberação na mesma função detém tudo tempo. Na verdade, vai sair-se bem ao mudar toda a libertação para auto-via. Seu uso de memória não será eficiente, no entanto, o efeito é mínimo. Todas as variáveis, em toda a linguagem de programação é efetivamente autorreleased.

De qualquer forma, usa o arco.

 7
Author: Chink Chonk, 2014-06-04 19:55:47

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]}
Mas a minha liberdade ...
    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

 4
Author: Erik Elmgren, 2010-01-16 07:01:06
De acordo com o Guia de programação de gestão de memória para o cacau:

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.

 3
Author: Steve Harrison, 2010-01-16 06:31:51