1

我正在尝试学习如何从命令行使用泄漏工具,这是我应该在以下位置产生泄漏的代码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。为了使用泄漏工具,我必须在我的代码中加入睡眠,这很烦人。

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

4

2 回答 2

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

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

NSArray其他不可变类 ( , )也可以观察到相同的行为NSDictionary

如果您将您的行替换为

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

然后你会看到内存泄漏。

于 2013-09-06T07:49:55.730 回答
0
  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];
于 2013-09-06T07:50:34.703 回答