目标C:ViewController中的GestureRecognizer – >保留周期?

我有一个我的ViewControllers(VC)的头文件中定义的以下属性:

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

在VC的实现中,在方法viewDidLoad ,我将TapRecognizers附加到以下属性:

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

VC UIImageView

  1. 这个UIImageView是否也通过GestureRecognizer强有力地包含了VC?
  2. 这是一个保留周期的经典例子吗?
  3. 如果是这样,这是正确的解决scheme?

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

从目标Obj-C编程概念 – 行动模式:

控制对象不(也不应该)保留它们的目标

因此UIGestureRecognizer不保留VC,也没有保留周期。

补充说明

正如skyddict指出的那样, -viewDidUnload已经被弃用,你应该使用-dealloc来执行清理。 然而,你不需要nil你的属性 – 当对象被销毁时它们被释放。

首先,所有IBOutlet属性都应声明为weak而不retain 。 其次,自iOS 6.0以来, viewDidUnload已被弃用。 你应该使用dealloc来做任何NSObject子类的最后清理(你重写这个方法来处理对象的实例variables以外的资源)。

如果您将图像视图声明为weak ,则不会有任何保留周期。您不必保留IBOutlet (因为它已被超级视图保留)。 如果你让IBOutlet软弱,你就不会在你指出的时候将它们清零。

这里没有强大的参考周期。 这是一个应该工作得很好的解决scheme。

视图控制器对UIImageView有很强的参考。 UIImageView在数组中保存其手势识别器(强引用),但是手势识别器没有强有力地保存目标/动作或委托。

你可以通过一个弱引用来保存UIImageView ,但是由于iOS 6的视图不会被卸载,所以对内存pipe理没有任何影响。