目标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
。
- 这个
UIImageView
是否也通过GestureRecognizer强有力地包含了VC? - 这是一个保留周期的经典例子吗?
-
如果是这样,这是正确的解决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理没有任何影响。