2012-03-02 7 views
0

ストーリーの短いバージョンをここで提供するために、私はメモリリークの例を作成しようとしているのですが、Instrumentsアプリケーションでリークパフォーマンスツールを使用する理由は何ですか?私はメモリリークを検出するこのメソッドを使用する必要がありますが、私が作成した例では、ツールが検出したメモリリークは発生していません(はい、ここでは失敗しているようです)。ここでは、コードがあります:リークパフォーマンスツールが明白なメモリリークを検出しない

// Memory_Leak_ExampleViewController.h 
// Memory Leak Example 

#import <UIKit/UIKit.h> 
#import "StringReturner.h" 

@interface Memory_Leak_ExampleViewController : UIViewController { 
    IBOutlet UITextField* xTF; 
    IBOutlet UITextField* yTF; 
    IBOutlet UITextView* result; 

    StringReturner* sr; 
} 

-(IBAction)addTogether; 
-(IBAction)releaseSR; 

@end 

// Memory_Leak_ExampleViewController.m 
// Memory Leak Example 

#import "Memory_Leak_ExampleViewController.h" 

@implementation Memory_Leak_ExampleViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    sr = [[StringReturner alloc] initWithFrame:self.view.frame]; 
} 

- (IBAction)addTogether 
{ 
    [result setText:[sr returnEq:[xTF.text intValue]:[yTF.text intValue]]]; 
} 

- (IBAction)releaseSR 
{ 
    [sr release]; 
} 

@end 

//StringReturner.h 

#import <UIKit/UIKit.h> 


@interface StringReturner : UIView { 
    NSString* string; 
    NSString* returnString; 
} 

-(NSString*)returnEq:(int)x:(int)y; 

@end 

// StringReturner.m 

#import "StringReturner.h" 


@implementation StringReturner 

- (id)initWithFrame:(CGRect)frame { 

    self = [super initWithFrame:frame]; 
    if (self) { 

    } 
    return self; 
} 

- (NSString*)returnEq:(int)x:(int)y 
{ 
    string = [[NSString alloc] initWithString:@""]; 
    int result = x+y; 
    string = [NSString stringWithFormat:@"%d + %d = %d", x, y, result]; 
    return string; 
} 

- (void)dealloc { 
    [super dealloc]; 
} 


@end 

IBActionsとIBOutletsのすべてが正しく設定されているので、メモリリークが一度追加し、StringReturnerのインスタンスを解放した後にすべきではありませんか?そうでない場合、私は何ですか間違っている?

答えて

0

@ ""のような静的文字列でNSStringを初期化しても、実際の文字列は割り当てられず、ヒープに置かれないため、Leaksはそれを検出しません。それは最適化です。

stringWithFormatで作成された他の文字列を漏らしてみてください。インストゥルメンツの漏れは、すぐにそれを選択します。 string = [NSString stringWithFormat:@"%d + %d = %d", x, y, result];の後に[string retain]を入れてリークを作成します。

+0

あなたのコメントを吹き飛ばしたと思います。ごめんなさい。しかしあなたの質問に答えるために、 'format'ファミリーの関数で作成された文字列が漏れることがあります。 – dbv

関連する問題