【问题标题】:Is it safe to override `release` for debugging?覆盖`release`进行调试是否安全?
【发布时间】:2011-02-09 08:54:13
【问题描述】:

有时我需要确定一个对象是否真的会被释放。我当然可以使用 Instruments,但这需要很长时间,而且我必须搜索数百万个对象,所以我曾经这样做:

-(void)release {
    NSLog(@"I'm released");
    [super release];
}

但问题是:这样做安全吗?当我覆盖-(void)release 时,我会遇到任何问题吗?还有,真的是void吗?如果我构建我的应用程序以进行分发,但每次意外都将它留在那里怎么办?还是只是安全?谢谢

【问题讨论】:

  • “真正发布”是什么意思?你认为有时 [foo release] 不会导致释放消息被发送吗?
  • @JeremyP [[[foo alloc] init] autorelease];??
  • 我明白了。您不想查看 release 方法是否有效,而是要查看对象是否被释放。它可能会在其生命周期内多次保留和发布,因此调试发布方法可能没那么有用。您可能想在下面查看 Laurent Etiemble 的答案。

标签: objective-c cocoa-touch debugging memory-leaks release


【解决方案1】:

没关系,但请限制它仅用于调试。


不是void,而是oneway void

-(oneway void)release {
    NSLog(@"I'm released"); // <-- remeber the @.
    [super release];
}

请注意,如果您只为 NSObject 覆盖它,那么发送到“免费桥接容器”(例如 NSCFArray 等)的 -release 消息将被遗漏,因为它们也覆盖了 -release 以转发到CFRelease.

【讨论】:

    【解决方案2】:

    释放消息只会减少实例的引用计数。

    如果你想知道实例是否已经被释放,那么最好覆盖dealloc消息:

    - (void)dealloc {
        NSLog(@"I am deallocated");
        [super dealloc];
    }
    

    明智地使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-14
      • 1970-01-01
      • 2011-10-15
      • 2021-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多