Блоки, которые выдают ошибку, - это блоки, в которых вы захватываете объекты, владеющие блоком.Например,
[object performBlock:^{
[object performSomeAction]; // Will raise a warning
}];
или
[self performBlock:^{
[self doSomething]; // Will raise a warning
}];
, но
[self performBlock:^{
[object doSomething]; // <-- No problem here
}];
Поскольку объект сохраняет свои блоки, а блок сохраняет свои объекты.Таким образом, в обоих этих случаях объект, который выполняет блок, владеет блоком, которому также принадлежит объект.Итак, у вас есть цикл - цикл сохранения.что означает утечку памяти.
В приведенном вами примере вы смотрите на метод класса .Вы вызываете блок класса UIView
, а не объекта UIView
.У класса нет памяти, связанной с ним.И вы, вероятно, вызываете эту функцию из контроллера, так что ссылка self
сохраняется блоком, но нет цикла, потому что self не сохраняет блок.
Точно так же, как вывозможно, заметили, что не все объекты, которые используются в блоке, должны иметь слабую ссылку - только те, которые вызывают цикл сохранения.