Какой вред удерживать себя в блоке? (Objective-C, GCD) - PullRequest
4 голосов
/ 27 сентября 2011

Во многих руководствах о том, как использовать блоки и GCD, всегда упоминается один совет: не сохраняйте себя в блоке.

Подробная информация при определении блока, если вы ссылаетесь на себя или ивару себя, то я остается в блоке.Поэтому обходной путь заключается в использовании модификатора __block для получения weakSelf или weakIvar.

Но что плохого в том, чтобы этого не делать?Если блок сохраняет себя, он должен освободить себя, когда блок закончен (я прав об этом?).Таким образом, в конечном счете, счетчик «Я» сбалансирован.Я знаю, что если self сохраняет блок, а блок сохраняет self, это будет цикл сохранения. Ни блок, ни self не будут освобождены.Но если вы используете GCD, self не сохраняет блок, почему бы не позволить блоку сохранить себя?

1 Ответ

8 голосов
/ 27 сентября 2011

Нет ничего плохого в том, чтобы удерживать себя, если блок не находится рядом. Если вы используете GCD для выполнения блока, а затем он удаляется, то это нормально. Это проблема, только если self имеет ссылку на блок, который он хранит (то есть self.someBlock = ^{self.x = 2;}), потому что тогда у вас есть цикл сохранения.

Лично мне нравится, когда блок сохраняет себя (если используется) в GCD, поскольку у вас нет реального контроля над выполнением блока, и его нельзя отменить, поэтому он может выполняться после освобождения self, если он не сохранен.

...