【问题标题】:Objective C: GestureRecognizer in ViewController --> retain cycle?目标 C:ViewController 中的 GestureRecognizer --> 保留周期?
【发布时间】:2015-08-20 05:07:43
【问题描述】:

我在我的一个 ViewController (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];
    }
    

【问题讨论】:

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


    【解决方案1】:

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

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

    因此UIGestureRecognizer不保留VC,也没有保留循环。

    补充说明

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 有道理。我立即将头文件中的所有 IBOutlets 更改为 weak,而不是 strong/retain。但是,现在当我打开与ViewController 关联的View 时,应用程序会冻结。有什么特别要注意的吗?
      • 发布您的 ViewController.m 和 .h 的要点
      • IBOutlet 属性设置为strong 本身不会导致保留周期。从内存管理的角度来看,它们是strong 还是weak 通常没有区别——有时你甚至需要它们强大(如果链接视图最初不在视图层次结构中)。此外,不需要nil 他们 - 它们只是实例变量的设置器和获取器,它们会自动释放。
      【解决方案3】:

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

      视图控制器对UIImageView 有一个强引用。 UIImageView 将其手势识别器保存在一个数组中(也是强引用),但手势识别器不持有目标/动作或强委托。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-29
        • 1970-01-01
        • 2018-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-23
        相关资源
        最近更新 更多