我在我的一个ViewControllers(VC)的头文件中定义了以下属性:
@property(nonatomic, retain) IBOutlet UIImageView *articleImageView1;
在VC的实现中,在方法viewDidLoad
中,我将TapRecognizers附加到这些属性:
UITapGestureRecognizer *captureImage1TapRecognizer = [[UITapGestureRecognizer alloc]
initWithTarget:self
[self.articleImageView1 addGestureRecognizer:captureImage1TapRecognizer];
VC强烈支持UIImageView
。
UIImageView
是否也通过GestureRecognizer强烈包含VC?如果是这样,这是正确的解决方案吗?
-(void)viewDidUnload {
...
[self setArticleImageView1:nil];
...
[super viewDidUnload];
}
答案 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视图不再被卸载,因此它对内存管理没有任何影响。