泄漏工具不报告os x上的内存泄漏

时间:2013-09-06 07:38:23

标签: objective-c macos memory-leaks

我正在尝试从命令行学习如何使用泄漏工具,这是我的代码应该在NSString上产生泄漏:

#import <Foundation/Foundation.h>
#import <unistd.h>

int main(int argc, const char *argv[])
{
    NSString *string = [[NSString alloc] init];

    pid_t pid = getpid();
    NSLog(@"pid: %d", pid);

    string = nil;
    [NSThread sleepForTimeInterval:20];

    return 0;
}

我了解到泄漏会每10秒刷新一次(不确定是否属实,但我将间隔设置为20秒)。

这应该会产生泄漏,因为它不在自动发布池中,而且我使用-fno-objc-arc编译为“安全”。

我尝试多次运行泄漏[pid]而没有泄漏报告。我在这做错了什么? 此外,我是命令行的粉丝,并且真的希望能够使用类似于valgrind的东西,它不支持os x 10.8。令人讨厌的是,为了使用泄漏工具,我必须在我的代码中进行睡眠。

有人可以在这里照亮一些灯吗?

2 个答案:

答案 0 :(得分:1)

NSString *string = [[NSString alloc] init];

返回空字符串的共享实例(多个调用返回相同的实例)。 因此,Foundation框架保留对此共享实例的引用  没有内存泄漏

其他不可变类(NSArrayNSDictionary)可以观察到相同的行为。

如果用

替换你的行
NSMutableString *string = [[NSMutableString alloc] init];

然后你会看到内存泄漏。

答案 1 :(得分:0)

  1. 如果使用ARC,则无泄漏。
  2. 空字符串([[NSString alloc] init])绝对是共享/重用的实例。系统必须保持对共享实例的引用,因此泄漏(正确)不会报告它。
  3. 更好的测试是使用自定义对象。然后你就可以确定没有任何魔法了。

    #if __has_feature(objc_arc)
    #error This leaks test only works when ARC is off
    #endif
    
    @interface Orphan : NSObject @end
    @implementation Orphan @end
    
    
    // in main, create an object without keeping a reference to it:
    [Orphan new];