UIAdam дал правильный ответ, но стоит понять, почему он правильный.
Во-первых, почему вы получили предупреждение?
self имеет сильную ссылку на webClient. webClient имеет сильную ссылку на завершениеHandler. завершениеHandler имеет сильную ссылку на себя. Таким образом, если все другие ссылки в вашей программе исчезнут, все еще останется сильная ссылка на каждый элемент в этом цикле, поэтому их никогда нельзя будет освободить.
Попытка написания
__weak id myself = self;
[myself populateData];
не работает конечно. Блок по-прежнему ссылается на себя, потому что присваивает его себе. Так что тут никакой разницы.
Решение UIAdam для письма
__weak id weakSelf = self; self.webClient.completionHandler = ^{ [weakSelf populateData]; };
означает, что weakSelf является слабой ссылкой, а блок содержит только слабую ссылку на себя. Итак, если все другие сильные ссылки на себя исчезли, останется только слабая ссылка. Слабая ссылка не поддерживает существование self, поэтому self освобождается.
Что, если это произойдет, но что-то еще имеет сильную ссылку на webClient и вызывается ваш блок? weakSelf — это слабая ссылка, и слабые ссылки обнуляются при освобождении объекта. Поэтому вы должны быть готовы к тому, что weakSelf будет равен нулю, когда ваш блок будет вызван. Вообще лучше написать
id strongSelf = weakSelf;
[strongSelf populatedData];
внутри блока: strongSelf может быть установлен в nil, или он будет установлен в self. Но поскольку это сильная ссылка, она останется отличной от нуля, пока блок не завершится. Если бы не было нуля с самого начала.
person
gnasher729
schedule
03.04.2014
self.webClient...
только наwebClient...
? - person jjv360   schedule 26.06.2012webClient
или нет.webClient
предположительно является сильным иваром (то есть сохраняется самим собой), поэтому, еслиself
сохраняетwebClient
иwebClient
сохраняет блок, а блок сохраняетself
, у вас есть цикл сохранения. - person UIAdam   schedule 26.06.2012self
? - person andyvn22   schedule 26.06.2012self
в блоке. - person UIAdam   schedule 26.06.2012