泄漏性能工具未检测到明显的内存泄漏

时间:2012-03-02 16:33:24

标签: objective-c ios xcode

为了在这里给出简短的故事版本,我试图举例说明内存泄漏以及为什么要在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

所有IBAction和IBOutlet都设置正确,所以在添加一次然后释放StringReturner实例后不应该有内存泄漏?如果没有,我做错了什么?

1 个答案:

答案 0 :(得分:0)

使用像@“”这样的静态字符串初始化NSString不会导致分配真正的字符串并将其放在堆上,因此Leaks不会检测到它。这是一个优化。

尝试泄露stringWithFormat创建的其他字符串。 Instruments Leaks将立即选择。在[string retain]之后加string = [NSString stringWithFormat:@"%d + %d = %d", x, y, result];来创建泄漏。