当我使用 Instruments Leaks 运行我的 iPhone 应用程序并使用 NSDateFormatter 解析一堆 NSDates 时,我的内存增加了大约 1mb 并保持不变,即使这些 NSDates 应该在解析后被释放(如果它们不是,我只是丢弃它们新)。
我认为 malloc(在下面我最重的堆栈跟踪中)可以成为 NSDate 的一部分,但我也认为它可能是仅在解析的某个中间步骤中使用的内存。有谁知道它是哪一个或如何找到它?
还有,有没有办法在 NSDate dealloc 上打断点,看看那 block 内存是否真的被回收了?
这是我的日期格式化程序解析这些日期的样子:
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”后,868 Kb 将在 iPhone OS 2.2.1 或 3.1.2(更多 future )上永久分配。
可以在以下位置阅读带有源代码和日志文件的完整文章 http://thegothicparty.com/dev/article/nsdateformatter-memory-leak/
关于iphone - 仪器(泄漏)和 NSDateFormatter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1117263/