【问题标题】:Am I responsible for releasing a UIView's gestureRecognizers in dealloc?我是否负责在 dealloc 中释放 UIView 的手势识别器?
【发布时间】:2011-06-21 11:41:44
【问题描述】:

我已将 UIGestureRecognizer 附加到 UIView。在dealloc期间释放这个是谁的责任?

具体来说:

UITapGestureRecognizer *t = 
[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(tapHandler:)];

[self.view addGestureRecognizer:t];
[t release];

所以,self.view 目前只保留了gestureRecognizer。

更新 我应该更清楚。我的问题与意见 dealloc 方法有关。当视图被释放时,视图的超类是否处理手势识别器的释放。我目前认为是这样。

【问题讨论】:

    标签: ios uigesturerecognizer memory-management


    【解决方案1】:

    经验法则是,无论何时拨打allocnewcopy,您都拨打release

    由于您调用了 alloc,因此您的代码不会过度释放或泄漏任何内容。

    虽然您可以自动释放手势识别器,但我会因为在可能的情况下显式释放对象是更好的内存管理。 (在自动释放池耗尽之前,自动释放的对象不会被释放。)

    【讨论】:

      【解决方案2】:

      你的代码是正确的。

      视图通过[self.view addGestureRecognizer:t]获得手势识别器的所有权。

      您可以在创建代码时通过自动释放t 来整理代码:

      UITapGestureRecognizer *t = [[[UITapGestureRecognizer alloc] initWithTarget:self.view action:@selector(tapHandler:)] autorelease];
      [self.view addGestureRecognizer:t];
      

      这意味着t 的所有所有权都在一个地方处理,从而减少了在修改代码时引入问题的可能性。

      【讨论】:

      • 在所有对象上调用自动释放而不是自己释放它们不是一个好习惯。
      • @Tieme 我不同意。它将所有内存管理代码保存在一个地方,从而提高了可读性,从而减少了由于忘记release 而导致的泄漏可能性。延迟释放不会影响内存高水位线,因为无论如何该方法退出后对象都会持续存在。你有什么理由说使用自动释放不是一个好习惯?
      • 我同意你对这个例子的看法。这里可以调用 autorelease。但是始终自动释放对象仍然不是一个好习惯,因为最终它会给您的内存管理增加一些开销。
      • @Tieme 这是过早的优化。 Autorelease 简化了内存管理,从而减少了可能出现的错误。最好使用 autorelease,直到您可以证明它的使用导致了问题。在我使用 Objective-C 的 5 年中,我很少想到 autorelease 会导致问题(我想到的是早期 iOS 设备上的图像处理)。我通过在有问题的代码周围添加一个自动释放池来解决这些问题,而不是承担内存管理的负担。
      • 这个怎么样,例如,谷歌你会发现其他十几个stackoverflow.com/questions/193288/…
      猜你喜欢
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多