我正在使用 Instruments 来尝试确定我的应用程序中是否有地方可以更有效地使用内存。我花了一些时间来熟悉 Instruments,但我通常是一个来自 Java 背景、正在寻找内存管理问题的新手。我似乎通过调用此方法使用了大约 1.82mb:
+ (NSString *)stringFromDateWithFormat:(NSDate *)date withFormat:(NSString *)format
{
NSDateFormatter *dateFormatter;
NSString *result;
if (nil == date || nil == format)
return nil;
result = nil;
if (nil != (dateFormatter = [[NSDateFormatter allocWithZone:[self zone]] init])) {
[dateFormatter setDateFormat:format];
if (nil != (result = [dateFormatter stringFromDate:date])) {
[dateFormatter release];
return result;
}
[dateFormatter release];
}
return nil;
}
当我发布日期格式化程序时,我想知道 NSString 结果 是否是我的问题。在我看来, stringFromDate 库调用将返回一个自动释放的对象,因此我无法“手动”管理它。有点不确定如何优化这个方法。
最佳答案
此方法是否在循环中被多次调用?自动释放的对象只有在它们所在的 NSAutoreleasePool 被释放时才会被释放。据我了解,默认的自动释放池被创建并释放每个事件循环。您可能在单个事件循环过程中创建了太多自动释放的对象。解决方案是在适当的地方创建自己的NSAutoreleasePool,并释放它以清除自动释放的对象。一个极端的例子可以说明这一点:
int i;
NSAutoreasePool* pool = nil;
for (i = 0; i < 1000000; ++i) {
/* Create a new pool every 10000 iterations */
if ((i % 10000) == 0) {
if (pool) [pool release];
pool = [[NSAutoreleasePool alloc] init];
}
[someObj someMethodThatCreatesAutoreleasedObjects];
}
[pool release];
在该示例中,当前池每 10,000 次迭代就会释放一次,并创建一个新池。您可以在Memory Management Programming Guide中阅读有关内存管理的更多信息。关于自动释放池的部分。
关于iPhone内存调试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/429401/