为了在这里给出简短的故事版本,我试图举例说明内存泄漏以及为什么要在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实例后不应该有内存泄漏?如果没有,我不做错了什么?
答案 0 :(得分:0)
使用像@“”这样的静态字符串初始化NSString不会导致分配真正的字符串并将其放在堆上,因此Leaks不会检测到它。这是一个优化。
尝试泄露stringWithFormat
创建的其他字符串。 Instruments Leaks将立即选择。在[string retain]
之后加string = [NSString stringWithFormat:@"%d + %d = %d", x, y, result];
来创建泄漏。