我正在尝试从命令行学习如何使用泄漏工具,这是我的代码应该在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。令人讨厌的是,为了使用泄漏工具,我必须在我的代码中进行睡眠。
有人可以在这里照亮一些灯吗?
答案 0 :(得分:1)
NSString *string = [[NSString alloc] init];
返回空字符串的共享实例(多个调用返回相同的实例)。 因此,Foundation框架保留对此共享实例的引用 没有内存泄漏。
其他不可变类(NSArray
,NSDictionary
)可以观察到相同的行为。
如果用
替换你的行NSMutableString *string = [[NSMutableString alloc] init];
然后你会看到内存泄漏。
答案 1 :(得分:0)
[[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];