泄漏的工具不报告OS X上的内存泄漏(leaks tool doesn't report m

2019-10-18 14:50发布

我想学习如何在命令行中使用泄漏的工具,这里是我的代码应该产生一个泄漏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很好。 这是烦人,我必须把睡在我的代码才能使用泄漏的工具。

任何人都可以在这里大放异彩一些灯光?

Answer 1:

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

返回空字符串的共享实例 (和多次调用返回相同的实例)。 基础框架保持到此共享实例的引用,因此没有内存泄漏

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

如果更换符合

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

然后你会看到内存泄漏。



Answer 2:

  1. 如果使用ARC有没有泄漏。
  2. 空字符串( [[NSString alloc] init]是最肯定的共享/重复使用实例。 该系统具有保持到共享实例的引用,因此泄漏会(正确地)没有举报。

一个更好的测试将是使用自定义对象。 然后,你可以肯定,没有介入的法宝。

#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];


文章来源: leaks tool doesn't report memory leak on os x