2012-03-02 108 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不会导致真正的字符串被分配并放在堆上,所以泄漏不会检测到它。这是一个优化。

尝试泄漏由stringWithFormat创建的其他字符串。仪器泄漏将立即采取。在string = [NSString stringWithFormat:@"%d + %d = %d", x, y, result];之后放置[string retain]以创建泄漏。

+0

我想我只是吹走你的评论。抱歉。但要回答你的问题,可以泄漏'format'系列函数创建的任何字符串。 – dbv 2012-03-02 16:51:02