簡體   English   中英

泄漏工具不會報告OS X上的內存泄漏

[英]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框架保留對此共享實例的引用,因此不存在內存泄漏

使用其他不可變類( NSArrayNSDictionary )也可以觀察到相同的行為。

如果您用

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

那么您將看到內存泄漏。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM