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]リークが報告されていない状態で、リークを複数回実行しようとしました。ここで何が間違っていますか?また、私はコマンド ライン ファンであり、os x 10.8 をあまりサポートしていない valgrind に似たものを使用できるようになりたいと思っています。リークツールを使用するためにコードにスリープを入れなければならないのは面倒です。

誰かここにライトを当ててくれませんか?

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 に答える