簡體   English   中英

儀器(Leaks)和NSDateFormatter

[英]Instruments (Leaks) and NSDateFormatter

當我使用Instruments Leaks運行我的iPhone應用程序並使用NSDateFormatter解析一堆NSDate時,我的內存大約增加1mb並保持不變,即使這些NSDate在解析后應該被釋放(如果它們不是新的,我只是丟棄它們)。

我認為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:]

謝謝!

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

在使用z選項單次調用“dateFromString”后,將在iPhone OS 2.2.1或3.1.2(更多信息)上永久分配868 Kb。

有關源代碼和日志文件的完整文章可以在http://thegothicparty.com/dev/article/nsdateformatter-memory-leak/上閱讀。

NSDateFormatter可能存在使用時區解析日期字符串的問題,因為當我更改格式化程序模式以刪除時區部分時,問題就消失了。

我改變了這個:

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

對此:

[df setDateFormat:@"EEE, d MMM yyyy H:m:s"];

但現在問題是日期沒有得到正確的時區所以我必須自己確定時區。

丟棄NSDateFormatters是什么意思? 你完成它們后會釋放它們嗎?

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

您的代碼分配內存,但您需要調用

[df release];

當你完成它們。 分配(或復制)對象時,其引用計數會增加1。 當您釋放對象(向其發送release消息)時,引用計數減少一個。 當引用計數達到0時,對象將被釋放。

如果你沒有發送它的release消息,它將留在內存中,你有內存泄漏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM