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 self
w tym bloku, najprawdopodobniej tylko w celu aktualizacji suwaka. Casting self
to 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, _timeSlider
wykonaj następujące czynności przed deklaracją bloku:
UISlider* __weak slider = _timeSlider;
Następnie wystarczy użyć slider
wewną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, self
a także minimalizuje lub całkowicie eliminuje prawdopodobieństwo cyklu zatrzymania. W powyższym przykładzie _timeSlider
wł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 variable
w tej kolejności brzmi bardziej naturalnie od prawej do lewej, jak: variable is a weak pointer to SomeType
.
timerDisp
nieruchomość jest w klasie?