Estou tentando aprender a contagem automática de referências no iOS 5. Agora, a primeira parte desta pergunta deve ser fácil:
É correto que eu NÃO precise escrever instruções explícitas de propriedade de liberação em meu acordo quando usar o ARC? Em outras palavras, é verdade que o seguinte NÃO precisa de um desdobramento explícito?
@interface MyClass : NSObject @property (strong, nonatomic) NSObject* myProperty; @end @implementation MyClass @synthesize myProperty; @end
Minha próxima e mais importante pergunta vem de uma linha no documento Transitions to ARC Release Notes :
Você não precisa (na verdade não pode) liberar variáveis de instância, mas pode precisar chamar [self setDelegate: nil] nas classes do sistema e outro código que não é compilado usando o ARC.
Isso levanta a questão: como sei quais classes de sistema não são compiladas com o ARC? Quando devo criar meu próprio desalocação e definir explicitamente propriedades de retenção forte para zero? Devo assumir que todas as classes de estrutura NS e UI usadas nas propriedades requerem acordos desastrosos explícitos?
Há uma abundância de informações sobre SO e em outras partes sobre as práticas de liberação de ivar de apoio de uma propriedade ao usar o rastreamento de referência manual, mas relativamente pouco sobre isso ao usar o ARC.
fonte
MyController : UIViewController
classe que cria e possui um UIView e também define o delegado da exibição para si mesmo. É o único proprietário retentor dessa opinião. Quando o controlador é desalocado, a visualização também deve ser desalocada. Importa então se o ponteiro do delegado está pendurado?UIWebView
, os documentos declaram explicitamente que você precisa anular o delegado.unsafe_unretained
é exatamente equivalente a umaassign
propriedade e é o comportamento normal dos relacionamentos de delegados no MRR, e esses precisam ser detalhados.Só para dar a resposta oposta ...
Resposta curta : não, você não precisa anular as propriedades auto-sintetizadas no
dealloc
ARC. E você não precisa usar o setter para aqueles que estão dentroinit
.Resposta longa : você deve fornecer propriedades sintetizadas personalizadas
dealloc
, mesmo no ARC. E você deve usar o setter para aqueles que estão dentroinit
.O ponto é que suas propriedades sintetizadas personalizadas devem ser seguras e simétricas em relação à anulação.
Um possível setter para um temporizador:
Um possível setter para uma exibição de rolagem, tableview, webview, campo de texto, ...:
Um possível setter para uma propriedade KVO:
Então você não tem que duplicar qualquer código para
dealloc
,didReceiveMemoryWarning
,viewDidUnload
, ... e sua propriedade pode seguramente ser tornada pública. Se você estava preocupado com a falta de propriedadesdealloc
, talvez seja hora de verificar novamente seus levantadores.fonte