4

当我使用 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:]

谢谢!

4

3 回答 3

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

868 Kb 将在 iPhone OS 2.2.1 或 3.1.2(更多内容)上在使用 z 选项时在一次调用“dateFromString”后永久分配。

包含源代码和日志文件的完整文章可以在 http://thegothicparty.com/dev/article/nsdateformatter-memory-leak/阅读

于 2010-03-11T20:19:33.550 回答
1

NSDateFormatter 解析带有时区的日期字符串可能存在问题,因为当我更改格式化程序模式以删除时区部分时,问题就消失了。

我从这里改变了它:

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

对此:

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

但现在的问题是日期没有得到正确的时区,所以我必须自己确定时区。

于 2009-07-13T05:10:09.160 回答
0

丢弃 NSDateFormatters 是什么意思?当你完成它们时,你会释放它们吗?

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

您的代码分配内存,但您需要调用

[df release];

当你完成了他们。当你分配(或复制)对象时,它的引用计数加一。当您释放对象(release向它发送消息)时,引用计数会减少 1。当引用计数达到 0 时,对象被释放。

如果您不发送release消息,它将保留在内存中并且您有内存泄漏。

于 2009-07-13T00:30:36.167 回答