Objective C:ViewController中的GestureRecognizer - >保留周期?

时间:2015-06-05 09:42:45

标签: ios objective-c memory-management memory-leaks uigesturerecognizer

我在我的一个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. 如果是这样,这是正确的解决方案吗?

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

3 个答案:

答案 0 :(得分:2)

首先,所有IBOutlet属性都应声明为weak而不是retain。其次,自iOS 6.0起,viewDidUnload已被弃用。您应该使用dealloc来对任何NSObject子类进行最后的清理(重写此方法以处理除对象的实例变量之外的其他资源)。

如果您将图像视图声明为weak,则不会有任何保留周期。您不必保留IBOutlet(因为它已被其超级视图保留)。如果你使IBOutlet变弱,你就不必像你指出的那样把它们弄掉。

答案 1 :(得分:2)

来自Concepts of Obj-C programming目标 - 行动模式:

  

控制对象不会(也不应该)保留其目标

因此UIGestureRecognizer不保留VC并且没有保留周期。

补充说明

正如skyddict所指出的那样,-viewDidUnload已被弃用,您应该使用-dealloc来执行清理。但是,您不需要nil您的属性 - 它们会在对象被销毁时被释放。

答案 2 :(得分:2)

这里没有强大的参考周期。这是一个应该正常工作的解决方案。

视图控制器具有对UIImageView的强引用。 UIImageView将其手势识别器保存在数组中(强引用也是如此),但手势识别器不会保持目标/操作或强烈委托。

您可以通过弱引用保留UIImageView,但由于iOS 6视图不再被卸载,因此它对内存管理没有任何影响。