Цель 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 больше не выгружаются, это не повлияет на управление памятью.