iPhone アプリでメモリ警告が表示されるので、Instruments の助けを借りて、リークを見つけたり、メモリをより効率的に使用したりしようとしています。とりわけ、自動解放されたオブジェクトをすべて取り出して、手動の alloc/init/release オブジェクトに置き換えようとしています。ただし、一部の API 呼び出しには「init」バージョンがないようです (以下のコードを参照)。確かに、いくつかの基本的な誤解があります。
API を「呼び出し」て、本質的に自動解放されたオブジェクトを取得した場合、これらのオブジェクトが Instruments でリークとして表示される可能性はありますか? Instrumentsでこの動作が見られるようです。
2 に「はい」の場合、「非自動リリース」の代替手段がなく、必要な API を使用している場合は無視する必要がありますか? また、このコードが頻繁に呼び出される場合、アルゴリズムを完全に再考する必要がありますか?
これは、頻繁に呼び出される私のアプリケーションのユーティリティ コードです。基本的に、2 つの日付が意味のある「等しい」かどうかを判断します。コメントアウトしたコードを残したので、コードベースで行っている改善の種類を確認できます。この DIDは、NSDate を手動で作成 (およびリリース) し始めたときに、その後 Instruments で実行したときにメモリリークを減らしました。助けた。ただし、漏れていると思われる日付コンポーネントオブジェクトがまだあります...しかし、それはAPI呼び出しです(コードのフォーマットについては申し訳ありませんが、SOで改善できないようです):
+ (BOOL)isDayEqualToDay:(NSDate*)date anotherDate:(NSDate*)anotherDate
{
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
//NSCalendar *cal;
NSDateComponents *componentsFromDate, *componentsFromAnotherDate;
NSUInteger unitFlags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit;
//cal = [NSCalendar currentCalendar];
componentsFromDate = [cal components:unitFlags fromDate:date];
componentsFromAnotherDate = [cal components:unitFlags fromDate:anotherDate];
BOOL bDatesEqual = ([componentsFromDate year] == [componentsFromAnotherDate year] &&
[componentsFromDate month] == [componentsFromAnotherDate month] &&
[componentsFromDate day] == [componentsFromAnotherDate day]);
[cal release];
return bDatesEqual;
/*
return (
[componentsFromDate year] == [componentsFromAnotherDate year] &&
[componentsFromDate month] == [componentsFromAnotherDate month] &&
[componentsFromDate day] == [componentsFromAnotherDate day]
);*/
}
componentsFromDate と componentsFromAnotherDate がリークとして表示されていると思いますが、本質的に NSData API 呼び出し (自動リリース) から返されたオブジェクトだけがあります。これをより効率的にするために他に何ができるのかわからず、Instruments を最適に使用する方法についての私の理解に疑問を呈しています。提案?