Цель C: GestureRecognizer в ViewController → сохранить цикл?

У меня есть следующее свойство, определенное в файле заголовка одного из моих ViewControllers (VC):

@property(nonatomic, retain) IBOutlet UIImageView *articleImageView1;

В реализации VC в методе viewDidLoad я присоединяю TapRecognizers к этим свойствам:

UITapGestureRecognizer *captureImage1TapRecognizer = [[UITapGestureRecognizer alloc]
                                                      initWithTarget:self
[self.articleImageView1 addGestureRecognizer:captureImage1TapRecognizer];

VC сильно удерживает UIImageView.

  • Этот элемент UIImageView также содержит VC сильно через GestureRecognizer?
  • Это классический пример цикла удержания?
  • Если да, то это будет правильным решением?

    -(void)viewDidUnload {
         ...
        [self setArticleImageView1:nil];
         ...
        [super viewDidUnload];
    }
    

Ответ 1

Прежде всего, все свойства IBOutlet должны быть объявлены как weak, а не retain. Во-вторых, viewDidUnload устарел с iOS 6.0. Вы должны использовать dealloc, чтобы выполнить окончательную очистку для любого подкласса NSObject (вы переопределяете этот метод для удаления ресурсов, отличных от переменных экземпляра объектов).

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

Ответ 2

Из Понятия программирования Obj-C по шаблону action-action:

Объекты управления не сохраняют цели (и не должны)

Таким образом, UIGestureRecognizer не сохраняет VC и цикл удержания отсутствует.

Дополнительные замечания

Как указано skyddict, -viewDidUnload устарел, и вы должны использовать -dealloc для выполнения очистки. Однако вам не нужно nil ваши свойства - они освобождаются при уничтожении объекта.

Ответ 3

Здесь нет сильного эталонного цикла. Это решение, которое должно работать нормально.

Контроллер представления имеет сильную ссылку на UIImageView. UIImageView содержит свои распознаватели жестов в массиве (также очень сильная ссылка), но распознаватель жестов не имеет цели/действия или делегирования.

Вы можете придерживаться UIImageView с помощью слабой ссылки, но поскольку представления iOS 6 больше не выгружаются, это не повлияет на управление памятью.