0

最初の 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 で始まらないメソッドから返されます }

4

1 に答える 1

1

alloc1 番目と 3 番目の警告に関して、コンパイラは、 「、、、、またはnewで始まる名前のメソッド」でオブジェクトを作成しようとしていると想定します( Advanced Memory Management Programming Guideを参照)。したがって、+1 オブジェクトを返す場合は、メソッド名がこれら 4 つのプレフィックスのいずれかで始まることを確認してください。これらのプレフィックスのいずれかを付けずに +1 オブジェクトを作成すると、うまくいきません。したがって、エラー #1 については、そのメソッドの名前を のようなものに変更すると、その警告は消えるはずです。(ただし、呼び出し元のメソッドがそれらの後でクリーンアップしない場合、警告はそのルーチンに移されるだけですが、一度に 1 ステップずつ見ていきましょう。)copymutableCopynewAnswerWithTiming

エラー#3についても同様に、そのメソッドの名前を次のように変更するとnewAnswerArrayFromQuestionTapAnswers(または何か...メソッド名を理解できるかどうかわかりません...で始まることを確認してnewください)、同様にその警告を排除します. どちらの場合も、適切な時点で解放するようにしてください。これら 2 つのそれぞれのメソッドを呼び出した人は、これらのオブジェクトを「所有」し、それらのクリーンアップを担当するからです。

余談ですが、エラー #1 についての議論で[self release]行う必要はありません。dealloc(率直に言って、エラーが発生しないことに驚いています。) これは必要ありません。なぜなら、selfまだretainCount0 になっていない場合はdealloc、そもそも到達できなかったからです。

エラー #2 に関して、プロパティperfectImageView2levelUpImageView定義はどのようになっていますか? retainまたはの場合strong、+2 を使用して何かを作成しており、retainCountおそらく/のautorelease後にを追加する必要があります。allocinit

于 2012-08-07T17:17:52.237 に答える