Додавання двох центів для підвищення точності та стилю. У більшості випадків self
у цьому блоці ви будете використовувати лише одного або пару членів , швидше за все, лише для оновлення слайдера. Кастинг self
є надмірним. Натомість краще бути явним і викидати лише ті об’єкти, які вам справді потрібні всередині блоку. Наприклад, якщо це примірник UISlider*
, скажімо, _timeSlider
перед виконанням блоку виконайте наступне:
UISlider* __weak slider = _timeSlider;
Потім просто використовуйте slider
всередині блоку. Технічно це більш точно, оскільки звужує цикл утримання потенціалу лише до потрібного вам об'єкта, а не до всіх об'єктів всередині self
.
Повний приклад:
UISlider* __weak slider = _timeSlider;
[_embeddedPlayer addPeriodicTimeObserverForInterval:CMTimeMake(1, 1)
queue:nil
usingBlock:^(CMTime time){
slider.value = time.value/time.timescale;
}
];
Крім того, найімовірніше, що об'єкт, який передається слабкому покажчику, вже є слабким вказівником всередині self
, а також мінімізує або повністю виключає ймовірність збереження циклу. У наведеному вище прикладі _timeSlider
насправді є властивість, що зберігається як слабка посилання, наприклад:
@property (nonatomic, weak) IBOutlet UISlider* timeSlider;
З точки зору стилю кодування, як і для C та C ++, змінні декларації краще читати справа наліво. Декларування SomeType* __weak variable
в такому порядку читає природніше справа наліво , як: variable is a weak pointer to SomeType
.
timerDisp
властивість класу?