Adicionando dois centavos em melhorar a precisão e o estilo. Na maioria dos casos, você usará apenas um ou alguns membros self
deste 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, _timeSlider
faça o seguinte antes da declaração do bloco:
UISlider* __weak slider = _timeSlider;
Depois é só usar slider
dentro 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 variable
nesta ordem lê mais naturalmente da direita para a esquerda, como: variable is a weak pointer to SomeType
.
timerDisp
uma propriedade na classe?