1

Я использую Xcode 5 и есть кодПочему предупреждение о сохранении цикла не выбрасывается?

@interface Controller { 
    __weak IBOutlet UIView *someView; 
} 

@implementation Controller { 

- (void)doSomething 
{ 
    [UIView animateWithDuration:0.5 animations:^{ 
     someView.hidden = YES; 
    }]; 
} 

- (void)doSomething1 
{ 
    [UIView animateWithDuration:0.5 animations:^{ 
     [self doSomething]; 
    }]; 
} 

Почему сохранить предупреждение цикл не брошенный там? Должен ли я использовать слабые ссылки на selfкаждый раз Я использую self в блоках?

Также я включил предупреждение Implicit retain of self within blocks и дал мне 100 предупреждений с рекомендацией написать self->ivar.prop (не ivar.prop) в блоках. Должен ли я делать это после того, как это предупреждение отключено по умолчанию?

ответ

4

Почему сохранить предупреждение цикла не брошенное там?

Блок содержит вас, но вы не сохраняете блок. Он будет уничтожен после завершения анимации. Итак, нет циклов.

Должен ли я использовать слабые ссылки на себя каждый раз, когда я использую self в блоках?

Если ваш блок не будет автоматически уничтожен (например, повторяющийся таймер), вам следует.

Должен ли я сделать это после того, как это предупреждение отключено по умолчанию?

В зависимости от контекста. Опять же, если ваши блоки живут в течение длительного времени, вы можете захотеть объявить не сохраненным weakSelf.

Но в принципе вы в порядке, если ваши блоки не будут где-то сохранены.

Смотрите также How do I avoid capturing self in blocks when implementing an API?

+0

Спасибо за разъяснения. Я пропустил, что этот блок сохраняется, только если он сохранен. – efpies

+0

Что означает, что блок будет «долгожителем»? Все блоки имеют конечное количество строк кода, поэтому он в конечном итоге выйдет. – Pwner

3

Это не цикл удержания. Это два метода, вызывающих друг друга в цикле. Цикл сохранения происходит, когда два экземпляра объекта имеют сильные (сохраненные) ссылки друг на друга, которые никогда не прерываются, и эти два объекта остаются в памяти без необходимости.

Пример с кодом: Retain cycle in ARC

0

Должен ли я использовать слабые ссылки на себя каждый раз, когда я использую себя в блоках?

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

Смежные вопросы