iOS - XCode 4.4 - 使用分析的潜在内存泄漏
Posted
技术标签:
【中文标题】iOS - XCode 4.4 - 使用分析的潜在内存泄漏【英文标题】:iOS - XCode 4.4 - Potential Memory Leaks Using Analyze 【发布时间】:2012-08-07 17:01:55 【问题描述】:我在我的第一个 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;
// 对象作为拥有引用返回给调用者(单个保留计数转移给调用者) // 对象泄露:分配并存储到 answerArray 中的对象是从名称 generateQuestionTapAnswers 不以 copy 开头的方法返回的,mutableCopy
【问题讨论】:
【参考方案1】:关于您的第一个和第三个警告,编译器将假定您将在“名称以 alloc
、new
、copy
或 mutableCopy
开头的方法中创建一个对象”(参见 @ 987654321@)。因此,如果您要返回 +1 对象,请确保您的方法名称以这四个前缀之一开头。如果您创建一个没有这些前缀之一的 +1 对象,它会不高兴。因此,对于错误 #1,如果您将该方法重命名为 newAnswerWithTiming
,则该警告应该会消失。 (但是,如果调用方法没有在它们之后清理,警告将被转移到该例程,但让我们一步一步来。)
同样,对于错误 #3,如果您将该方法重命名为 newAnswerArrayFromQuestionTapAnswers
(或其他任何名称……我不确定我是否理解您的方法名称……请确保它以 new
开头),您将同样消除该警告。在这两种情况下,只需确保在适当的时间释放它,因为调用这两个各自方法的人现在“拥有”这些对象并负责清理它们。
顺便说一句,在讨论错误 #1 时,您无需在 dealloc
中添加 [self release]
。 (坦率地说,我很惊讶它不会产生错误。)你不需要它,因为如果self
不是已经为零的retainCount
,你就永远不会在第一次到达dealloc
地点。
关于错误#2,属性perfectImageView2
和levelUpImageView
是如何定义的?如果retain
或strong
,您正在创建带有+2 retainCount
的内容,并且您可能希望在alloc
/init
之后添加autorelease
。
【讨论】:
嗨罗伯特,我是这样定义的,谢谢@property (nonatomic, strong) UIImageView * perfectImageView2 @PierLim 然后该属性将为您提供retain
它,因此您应该提供autorelease
以确保您的保留计数下降到+1,例如self.levelUpImageView = [[[UIImageView alloc] initWithImage:levelUpImage] autorelease];
.
顺便说一句,在错误 #2 上,警告是否真的指向 setFrame
行?我会在前一行预料到的。
嗨罗伯特,在错误 #2 中,错误指向前一行,而不是 setFrame,谢谢!
您好 Robert,感谢您的回复 - 它让我开始了解 ios 内存管理/约定。以上是关于iOS - XCode 4.4 - 使用分析的潜在内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章
仪器无法在 Xcode 4.4 的真实 iOS 设备中运行 GUI 测试脚本