[英]leaks tool doesn't report memory leak on os x
我正在嘗試從命令行學習如何使用泄漏工具,這是我的代碼,應該會在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。 為了使用泄漏工具,我不得不在代碼中放置睡眠,這很煩人。
有人可以在這里發光嗎?
NSString *string = [[NSString alloc] init];
返回一個空字符串的共享實例 (多個調用返回相同的實例)。 Foundation框架保留對此共享實例的引用,因此不存在內存泄漏 。
使用其他不可變類( NSArray
, NSDictionary
)也可以觀察到相同的行為。
如果您用
NSMutableString *string = [[NSMutableString alloc] init];
那么您將看到內存泄漏。
[[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];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.