[英]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.