Dodanie dwóch centów za poprawę precyzji i stylu. W większości przypadków użyjesz tylko jednego lub kilku członków selfw tym bloku, najprawdopodobniej tylko w celu aktualizacji suwaka. Casting selfto przesada. Zamiast tego lepiej jest być jawnym i rzucać tylko te obiekty, których naprawdę potrzebujesz w bloku. Na przykład, jeśli jest to przykład UISlider*, powiedzmy, _timeSliderwykonaj następujące czynności przed deklaracją bloku:
UISlider* __weak slider = _timeSlider;
Następnie wystarczy użyć sliderwewnątrz bloku. Technicznie jest to bardziej precyzyjne, ponieważ zawęża potencjalny cykl zatrzymania tylko do potrzebnego obiektu, a nie do wszystkich obiektów w środku self.
Pełny przykład:
UISlider* __weak slider = _timeSlider;
[_embeddedPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1, 1)
queue:nil
usingBlock:^(CMTime time){
slider.value = time.value/time.timescale;
}
];
Dodatkowo, najprawdopodobniej obiekt rzucany na słaby wskaźnik jest już wewnątrz słabym wskaźnikiem, selfa także minimalizuje lub całkowicie eliminuje prawdopodobieństwo cyklu zatrzymania. W powyższym przykładzie _timeSliderwłaściwość jest przechowywana jako słaby odnośnik, np .:
@property (nonatomic, weak) IBOutlet UISlider* timeSlider;
Pod względem stylu kodowania, podobnie jak w C i C ++, deklaracje zmiennych lepiej czytać od prawej do lewej. Deklarowanie SomeType* __weak variablew tej kolejności brzmi bardziej naturalnie od prawej do lewej, jak: variable is a weak pointer to SomeType.
timerDispnieruchomość jest w klasie?