Циклические ссылки

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

Получится, что self → имеет strong-ссылку на блок. А блок → strong-ссылку на self. И, так как никто из них не потеряет ссылку на себя, они не уничтожатся при деаллоке.

Чтобы этого не произошло, для использование self в блоке, создается слабая ссылка на self и передается в блок:

__weak typeof(self) wself = self;
[[SoundProvider sharedInstance] makeSome:(NSString *)noise
                       completionHandler:^(id spectrum, NSError *error) {
    if (!error) {
        wself.loud = spectrum;
    }
}];

Теперь self не имеет лишнего родителя, и будет уничтожена при обычном деаллоке.

См. также Working with Blocks в документации Какао.

 31   2014   code   Objective-C
Популярное