Gostaria de saber em que situação você usou -retainCount
até agora e, eventualmente, os problemas que podem ocorrer ao usá-lo.
Obrigado.
Gostaria de saber em que situação você usou -retainCount
até agora e, eventualmente, os problemas que podem ocorrer ao usá-lo.
Obrigado.
Respostas:
Você nunca deve usar -retainCount
, porque nunca diz nada de útil. A implementação dos frameworks Foundation e AppKit / UIKit é opaca; você não sabe o que está sendo retido, por que está sendo retido, quem está retendo, quando foi retido e assim por diante.
Por exemplo:
[NSNumber numberWithInt:1]
teria um retainCount
igual a 1. Não tem. São 2.@"Foo"
teria um retainCount
igual a 1. Não tem. É 1152921504606846975.[NSString stringWithString:@"Foo"]
teria um retainCount
igual a 1. Não tem. Novamente, é 1152921504606846975.Basicamente, uma vez que qualquer coisa pode reter um objeto (e, portanto, alterá-lo retainCount
) e como você não tem a fonte para a maior parte do código que executa um aplicativo, o de um objeto não retainCount
tem sentido.
Se você está tentando rastrear porque um objeto não está sendo desalocado, use a ferramenta Vazamentos em Instrumentos. Se você está tentando rastrear porque um objeto foi desalocado tão cedo, use a ferramenta Zumbis em Instrumentos.
Mas não use -retainCount
. É um método verdadeiramente inútil.
editar
Todos vão para http://bugreport.apple.com e solicitem que -retainCount
seja descontinuado. Quanto mais pessoas pedirem, melhor.
editar # 2
Como uma atualização, [NSNumber numberWithInt:1]
agora tem um número retainCount
de 9223372036854775807. Se seu código esperava que fosse 2, ele agora está corrompido.
- (NSUInteger)retainCount{return NSUIntegerMax;}
.
retainCount
.
Seriamente. Só não faça isso.
Basta seguir as diretrizes de gerenciamento de memória e apenas liberar o que você alloc
, new
oucopy
(ou qualquer coisa que você chamado retain
em cima originalmente).
@bbum disse isso melhor aqui no SO , e com ainda mais detalhes em seu blog .
-retainCount
pode ser obtida (com muito mais detalhes) de Instrumentos e suas ferramentas.
retain
, retain
, retain
, autorelease,
disparo automático, autorelease
poderia ser um resultado perfeitamente válida de passar um objeto por meio da API UIKit, por exemplo.
Objetos liberados automaticamente são um caso em que a verificação de -retainCount não é informativa e é potencialmente enganosa. A contagem de retenção nada diz sobre quantas vezes -autorelease foi chamado em um objeto e, portanto, quantas vezes ele será liberado quando o pool de autorelease atual for drenado.
Eu não encontrar retainCounts muito útil quando verificada com 'instrumentos'.
Usando a ferramenta 'alocações', certifique-se de que 'Registrar contagens de referência' esteja ativado e você possa acessar qualquer objeto e ver seu histórico de reterContagem.
Ao emparelhar alocações e liberações, você pode ter uma boa imagem do que está acontecendo e, muitas vezes, resolver os casos difíceis em que algo não está sendo liberado.
Isso nunca me decepcionou - incluindo encontrar bugs nas primeiras versões beta do iOS.
Dê uma olhada na documentação da Apple sobre NSObject, ela cobre praticamente sua pergunta: NSObject repeatCount
Em suma, retémCount provavelmente é inútil para você, a menos que tenha implementado seu próprio sistema de contagem de referência (e quase posso garantir que não o terá).
Nas próprias palavras da Apple, retémCount "normalmente não tem valor na depuração de problemas de gerenciamento de memória".
É claro que você nunca deve usar o método retentCount em seu código, já que o significado de seu valor depende de quantas autoreleases foram aplicadas ao objeto e isso é algo que você não pode prever. No entanto, é muito útil para depuração - especialmente quando você está caçando vazamentos de memória no código que chama métodos de objetos Appkit fora do loop de evento principal - e não deve ser descontinuado.
Em seu esforço para demonstrar seu ponto de vista, você exagerou seriamente a natureza inescrutável do valor. É verdade que nem sempre é uma contagem de referência. Existem alguns valores especiais que são usados para sinalizadores, por exemplo, para indicar que um objeto nunca deve ser desalocado. Um número como 1152921504606846975 parece muito misterioso até que você o escreva em hexadecimal e obtenha 0xfffffffffffffff. E 9223372036854775807 é 0x7fffffffffffffff em hexadecimal. E realmente não é tão surpreendente que alguém opte por usar valores como esses como sinalizadores, visto que levaria quase 3.000 anos para obter um retémContagem tão alto quanto o maior número, supondo que você incrementou retentãoContagem 100.000.000 vezes por segundo.
Que problemas você pode obter ao usá-lo? Tudo o que faz é retornar a contagem de retenção do objeto. Nunca liguei para isso e não consigo pensar em nenhum motivo para fazer isso. Eu o substituí em singletons para garantir que eles não sejam desalocados.
retainCount
para gerenciamento de memória.
Você não deve se preocupar com vazamento de memória até que seu aplicativo esteja instalado, funcionando e fazendo algo útil.
Assim que estiver, inicie o Instruments e use o aplicativo para ver se vazamentos de memória realmente acontecem. Na maioria dos casos, você mesmo criou um objeto (portanto, você o possui) e se esqueceu de liberá-lo após terminar.
Não tente otimizar seu código enquanto o escreve, seus palpites sobre o que pode vazar memória ou demorar muito estão frequentemente errados quando você realmente usa o aplicativo normalmente.
Tente escrever o código correto, por exemplo, se você criar um objeto usando aloc e tal, certifique-se de liberá-lo corretamente.
-retainCount
.