潜在的内存泄漏使用分析
我在我的第一个iPhone应用程序上运行分析,并发现一些潜在的内存泄漏。 该应用程序本身在模拟器上正常工作。 我想做正确的事情,并清除潜在的内存泄漏,但有些令人费解。 也许有人可以帮助我吗?
提前致谢。
码头。
错误1)分析器显示“存储在tempDate和tempAns中的对象的潜在泄漏”
#import "Answer.h"
@implementation Answer
@synthesize answerTiming;
@synthesize xPosition;
@synthesize earlyOrLate;
@synthesize hit;
+ (Answer *) createAnswerWithTiming :(NSDate *)paramTiming andXPosition :(float) xPosition
{
NSDate * tempDate = [[NSDate alloc] initWithTimeInterval:0 sinceDate:paramTiming];
Answer * tempAns = [[Answer alloc] init ];
[tempAns setAnswerTiming:tempDate];
[tempDate release];
[tempAns setXPosition:xPosition];
[tempAns setEarlyOrLate:0];
[tempAns setHit:false];
return tempAns;
}
- (void)dealloc {
[answerTiming release];
[self release];
[super dealloc];
}
@end
错误2)分析器说(见下文)
- (void)viewDidLoad
{
[super viewDidLoad];
........
...
UIImage * perfectImage = [UIImage imageNamed: @"perfect.png"];
self.perfectImageView2 = [[UIImageView alloc]initWithImage:perfectImage];
//方法返回+1保留计数的目标C内容
[self.perfectImageView2 setFrame:CGRectMake(145.0f,
150.0f,
self.perfectImageView2.image.size.width,
self.perfectImageView2.image.size.height)];
self.view.backgroundColor = [UIColor whiteColor];
UIImage * levelUpImage = [UIImage imageNamed:@"levelup.png"];
self.levelUpImageView = [[UIImageView alloc] initWithImage:levelUpImage];
[self.levelUpImageView setFrame:CGRectMake(100.0f,
400.0f,
self.levelUpImageView.image.size.width,
self.levelUpImageView.image.size.height)];
//对象泄漏,分配的对象在此执行路径中未被引用,并且保留计数为+1
self.view.backgroundColor = [UIColor whiteColor];
}
错误3)
- (NSMutableArray *) generateQuestionTapAnswers:(NSString *) answersString withFirstBeat: (NSDate *) firstBeatTime
{
NSArray * notesToDraw = [answersString componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString: @" "]];
float noteValueOffset = 0.0;
NSMutableArray * answerArray = [[NSMutableArray alloc] init ];
//方法返回一个+1保留计数的客观C对象
for (int i=1; i < notesToDraw.count; i++) // i = 0 is the time signature
{
.....
}
return answerArray;
//对象作为拥有引用返回给调用者(单个保留计数传递给调用者)// Object泄漏:分配并存储到answerArray中的对象从名称generateQuestionTapAnswers不以副本开始的方法返回,mutableCopy}
关于第一个和第三个警告,编译器会假定你将在“一个名称以alloc
, new
, copy
或mutableCopy
开头的方法”中创建一个对象(参见高级内存管理编程指南)。 因此,如果您要返回+1对象,请确保您的方法名称以这四个前缀中的一个开头。 如果你创建一个没有这些前缀的+1对象,它将不会很开心。 因此,对于错误#1,如果您将该方法重命名为newAnswerWithTiming
,则该警告应该消失。 (如果调用方法在它们之后没有清理,警告将转移到该例程,但我们一次只能采取一步。)
同样,对于错误#3,如果您将该方法重命名为newAnswerArrayFromQuestionTapAnswers
(或其他任何...我不确定是否了解您的方法名称...只是确保它始于new
),您同样会消除该警告。 在这两种情况下,只要确保在适当的位置释放它,因为现在调用这两种方法的人现在“拥有”这些对象并负责清理它们。
dealloc
一下,在讨论错误#1时,你不需要在dealloc
中进行[self release]
。 (坦率地说,我很惊讶它不会产生错误。)你不需要它,因为如果self
还没有处于retainCount
为零的状态,那么你永远不会首先获得dealloc
。
关于错误#2,如何定义属性perfectImageView2
和levelUpImageView
? 如果retain
或者strong
,你正在用+2 retainCount
创建一些东西,并且你可能想在alloc
/ init
之后添加一个autorelease
。