<iOS>视图添加手势不会retain当前视图

本文详细探讨了在iOS开发中,当在视图上添加手势后,手势与视图之间的内存管理关系。重点说明了如何避免内存泄漏问题,通过正确地管理手势的生命周期,确保程序资源的有效释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一个view A上添加一个手势B后,view A会retain住手势B

所以如果这个手势B, 是一个全局的,那么最后在释放view A时, 应该去remove手势B, 否则手势B则不能被release掉。


当然,如果我们使用手势是像下面这样使用的,则在release view A时, 就不需要再去remove这个手势了。

    mVi = [[MSViewalloc]initWithFrame:CGRectMake(50,150,100, 100)];

    UITapGestureRecognizer *tapGue = [[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(tapedCalled:)];

    [mVi addGestureRecognizer:tapGue];

    [tapGue release];

因为这时的手势,就只有被这个mVi给retain住的,而如果mVi随程序自然地release掉后, 手势自然也会被release掉的。所以只要这个mVi没有被释放, 那么这个手势自然也不会释放, 这一点需要记住。


如果存在多个 view 共用一个手势的情况, 则更应该清楚知道手势的retainCount, 以防内存释放不了的问题。



在测试过程中, 用instruments进行观察过,

一个uiview添加了一个执行后,除非特殊需要, 一般来说, 就算是不去执行

[mVi removeGestureRecognizer:tapGue];

操作, 也不会出现内存泄漏的错误, 估计是因为mVi这样的uiview在dealloc时,会自己释放所有添加到自己身上的手势对象。所以才不会出现内存泄漏的情况。换一句话来说, 就是如果不是特别需要, 执不执行removeGestureRecognizer,意义都不大。


为了验证上面的这个说法, 自己去继续一个手势类就更容易理解了。然后自己写了一个类直接继承UITapGestureRecognizer, 并只实现一个方法,就是dealloc {

NSLog(@"Gesture dealloc");

[super dealloc];

}

然后添加到mVi上,不管执不执行[mVi removeGestureRecognizer:tapGue]; 这个方法, 我们发现, 这个手势都会在mVi release并dealloc时, 手势的方法dealloc都会被调用。

所以可以肯定地判断出, uiview这样的类在dealloc时, 底层执行了一个移除所有手势的操作, 这样子, 上面添加的所有手势才会得以释放。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值