Ajout de deux cents sur l'amélioration de la précision et du style. Dans la plupart des cas, vous n'utiliserez qu'un ou deux membres de selfdans ce bloc, très probablement juste pour mettre à jour un curseur. Le casting selfest exagéré. Au lieu de cela, il vaut mieux être explicite et ne diffuser que les objets dont vous avez vraiment besoin à l'intérieur du bloc. Par exemple, si c'est une instance de UISlider*, disons, _timeSliderfaites simplement ce qui suit avant la déclaration de bloc:
UISlider* __weak slider = _timeSlider;
Ensuite, utilisez simplement l' sliderintérieur du bloc. Techniquement, cela est plus précis car il réduit le cycle de rétention potentiel à l'objet dont vous avez besoin, pas à tous les objets à l'intérieur self.
Exemple complet:
UISlider* __weak slider = _timeSlider;
[_embeddedPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1, 1)
queue:nil
usingBlock:^(CMTime time){
slider.value = time.value/time.timescale;
}
];
De plus, très probablement, l'objet projeté sur un pointeur faible est déjà un pointeur faible à l'intérieur, ce selfqui minimise ou élimine complètement la probabilité d'un cycle de rétention. Dans l'exemple ci-dessus, _timeSliderest en fait une propriété stockée en tant que référence faible, par exemple:
@property (nonatomic, weak) IBOutlet UISlider* timeSlider;
En termes de style de codage, comme avec C et C ++, les déclarations de variables sont mieux lues de droite à gauche. Déclarant SomeType* __weak variabledans cet ordre se lit plus naturellement de droite à gauche comme: variable is a weak pointer to SomeType.
timerDisppropriété est-elle sur la classe?