4

Instruments Leaks を使用して iPhone アプリを実行し、NSDateFormatter を使用して多数の NSDates を解析すると、解析後にこれらの NSDates を解放する必要があるにもかかわらず、メモリが約 1 MB 増加し、残ります (新しくない場合は破棄します)。

malloc (以下の最も重いスタック トレース) は NSDate の一部になる可能性があると考えましたが、解析の中間ステップでのみ使用されるメモリである可能性も考えました。誰がそれがどれであるか、または見つける方法を知っていますか?

また、NSDate dealloc にブレークポイントを設定して、そのメモリが実際に回収されているかどうかを確認する方法はありますか?

これらの日付を解析するための私の日付フォーマッタは次のようになります。

df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"EEE, d MMM yyyy H:m:s z"];

メモリが増加してそこにとどまる場合の最も重いスタック トレースを次に示します。

   0 libSystem.B.dylib  208.80 Kb     malloc
   1 libicucore.A.dylib  868.19 Kb     icu::ZoneMeta::getSingleCountry(icu::UnicodeString const&, icu::UnicodeString&)
   2 libicucore.A.dylib  868.66 Kb     icu::ZoneMeta::getSingleCountry(icu::UnicodeString const&, icu::UnicodeString&)
   3 libicucore.A.dylib  868.67 Kb     icu::ZoneMeta::getSingleCountry(icu::UnicodeString const&, icu::UnicodeString&)
   4 libicucore.A.dylib  868.67 Kb     icu::DateFormatSymbols::initZoneStringFormat()
   5 libicucore.A.dylib  868.67 Kb     icu::DateFormatSymbols::getZoneStringFormat() const
   6 libicucore.A.dylib  868.67 Kb     icu::SimpleDateFormat::subParse(icu::UnicodeString const&, int&, unsigned short, int, signed char, signed char, signed char*, icu::Calendar&) const
   7 libicucore.A.dylib  868.67 Kb     icu::SimpleDateFormat::parse(icu::UnicodeString const&, icu::Calendar&, icu::ParsePosition&) const
   8 libicucore.A.dylib  868.67 Kb     icu::DateFormat::parse(icu::UnicodeString const&, icu::ParsePosition&) const
   9 libicucore.A.dylib  868.67 Kb     udat_parse
  10 CoreFoundation  868.67 Kb     CFDateFormatterGetAbsoluteTimeFromString
  11 CoreFoundation  868.67 Kb     CFDateFormatterCreateDateFromString
  12 Foundation  868.67 Kb     -[NSDateFormatter getObjectValue:forString:range:error:]
  13 Foundation  868.75 Kb     -[NSDateFormatter getObjectValue:forString:errorDescription:]
  14 Foundation  868.75 Kb     -[NSDateFormatter dateFromString:]

ありがとう!

4

3 に答える 3

3
[df setDateFormat:@"EEE, d MMM yyyy H:m:s z"]; // Remove the `z`

z オプションを使用すると、「dateFromString」を 1 回呼び出した後、868 KB が iPhone OS 2.2.1 または 3.1.2 (今後追加予定) に永続的に割り当てられます。

ソース コードとログ ファイルを含む完全な記事は、 http://thegothicparty.com/dev/article/nsdateformatter-memory-leak/で読むことができます。

于 2010-03-11T20:19:33.550 に答える
0

NSDateFormatters を破棄するとはどういう意味ですか? それらを使い終わったら、それらを解放しますか?

df = [[NSDateFormatter alloc] init]; // allocates memory

コードはメモリを割り当てますが、呼び出す必要があります

[df release];

それらを使い終わったら。オブジェクトを割り当て (またはコピー) すると、その参照カウントが 1 つ増えます。オブジェクトを解放すると (オブジェクトにreleaseメッセージを送信すると)、参照カウントが 1 つ減ります。参照カウントが 0 になると、オブジェクトの割り当てが解除されます。

メッセージを送信しないreleaseと、メモリに残り、メモリリークが発生します。

于 2009-07-13T00:30:36.167 に答える