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】:

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

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

顺便说一句,在讨论错误 #1 时,您无需在 dealloc 中添加 [self release]。 (坦率地说,我很惊讶它不会产生错误。)你不需要它,因为如果self 不是已经为零的retainCount,你就永远不会在第一次到达dealloc地点。

关于错误#2,属性perfectImageView2levelUpImageView 是如何定义的?如果retainstrong,您正在创建带有+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 5.1 模拟器问题

仪器无法在 Xcode 4.4 的真实 iOS 设备中运行 GUI 测试脚本

iOS 5 的潜在(近似)未来使用趋势是啥?

使用 XCode 8 修复 iOS 11 崩溃

iOS14 中 UICollectionview 的潜在错误

如何在 Xcode 中选择 iOS 模拟器作为目标?