Adicionando dois centavos em melhorar a precisão e o estilo. Na maioria dos casos, você usará apenas um ou alguns membros selfdeste bloco, provavelmente apenas para atualizar um controle deslizante. Fundição selfé um exagero. Em vez disso, é melhor ser explícito e converter apenas os objetos que você realmente precisa dentro do bloco. Por exemplo, se for uma instância de UISlider*, digamos, _timeSliderfaça o seguinte antes da declaração do bloco:
UISlider* __weak slider = _timeSlider;
Depois é só usar sliderdentro do bloco. Tecnicamente, isso é mais preciso, pois restringe o ciclo de retenção potencial apenas ao objeto que você precisa, e não a todos os objetos internos self.
Exemplo completo:
UISlider* __weak slider = _timeSlider;
[_embeddedPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1, 1)
queue:nil
usingBlock:^(CMTime time){
slider.value = time.value/time.timescale;
}
];
Além disso, provavelmente o objeto que está sendo convertido em um ponteiro fraco já é um ponteiro fraco por dentro self, além de minimizar ou eliminar completamente a probabilidade de um ciclo de retenção. No exemplo acima, _timeSlideré realmente uma propriedade armazenada como uma referência fraca, por exemplo:
@property (nonatomic, weak) IBOutlet UISlider* timeSlider;
Em termos de estilo de codificação, como em C e C ++, as declarações de variáveis são melhor lidas da direita para a esquerda. Declarando SomeType* __weak variablenesta ordem lê mais naturalmente da direita para a esquerda, como: variable is a weak pointer to SomeType.
timerDispuma propriedade na classe?