Я боюсь, что этот вопрос довольно простой, но я думаю, что он имеет отношение ко многим программистам Objective-C, которые попадают в блоки.Сохраняйте цикл на `self` с блоками
Что я слышал, так это то, что, поскольку блоки фиксируют локальные переменные, на которые ссылаются в них, как const
копии, использование в блоке self
может привести к циклу сохранения, если этот блок будет скопирован. Итак, мы должны использовать __block
, чтобы заставить блок напрямую работать с self
вместо того, чтобы его копировать.
__block typeof(self) bself = self;
[someObject messageWithBlock:^{ [bself doSomething]; }];
вместо того, чтобы просто
[someObject messageWithBlock:^{ [self doSomething]; }];
То, что я хотел бы знать, заключается в следующем: если это так, то есть ли способ, что я могу избежать уродства (помимо использования GC)?
Мне нравится называть мои `self` proxies` this`, чтобы перевернуть все вокруг. В JavaScript я называю свое `this` закрытием` self`, поэтому он чувствует себя хорошо и сбалансированно. :) – devios1 2013-07-30 22:43:14
Интересно, есть ли какие-либо эквивалентные действия, которые нужно выполнить, если я использую блоки Swift – 2015-11-18 20:48:20
@BenLu абсолютно! в Swift-закрытиях (и функции, которые передаются вокруг, которые упоминают себя неявно или явно) будут сохраняться. Иногда это желательно, и в других случаях он создает цикл (потому что сам закрытие становится собственностью самого себя (или принадлежит чему-то себе). Основная причина этого - из-за ARC. – Ethan 2016-04-29 14:11:59