潜在的内存泄漏使用分析

我在我的第一个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}


关于第一个和第三个警告,编译器会假定你将在“一个名称以allocnewcopymutableCopy开头的方法”中创建一个对象(参见高级内存管理编程指南)。 因此,如果您要返回+1对象,请确保您的方法名称以这四个前缀中的一个开头。 如果你创建一个没有这些前缀的+1对象,它将不会很开心。 因此,对于错误#1,如果您将该方法重命名为newAnswerWithTiming ,则该警告应该消失。 (如果调用方法在它们之后没有清理,警告将转移到该例程,但我们一次只能采取一步。)

同样,对于错误#3,如果您将该方法重命名为newAnswerArrayFromQuestionTapAnswers (或其他任何...我不确定是否了解您的方法名称...只是确保它始于new ),您同样会消除该警告。 在这两种情况下,只要确保在适当的位置释放它,因为现在调用这两种方法的人现在“拥有”这些对象并负责清理它们。

dealloc一下,在讨论错误#1时,你不需要在dealloc中进行[self release] 。 (坦率地说,我很惊讶它不会产生错误。)你不需要它,因为如果self还没有处于retainCount为零的状态,那么你永远不会首先获得dealloc

关于错误#2,如何定义属性perfectImageView2levelUpImageView ? 如果retain或者strong ,你正在用+2 retainCount创建一些东西,并且你可能想在alloc / init之后添加一个autorelease

链接地址: http://www.djcxy.com/p/43735.html

上一篇: Potential Memory Leaks Using Analyze

下一篇: Static Analyzer says I have a leak....why?