我正在使用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库调用将返回一个自动释放的对象,所以我无法“手动”管理它。有点不确定如何优化这种方法。
答案 0 :(得分:4)
这种方法在循环中被调用了很多次吗?自动释放的对象只有在它们所在的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部分中阅读有关内存管理的更多信息。
答案 1 :(得分:0)
无论如何你需要返回一个自动释放的对象,所以你应该对结果字符串做什么。我没有看到任何与内存相关的错误,但是你的代码肯定比需要的更冗长。请记住,在Objective-C中,如果在nil上调用方法,则返回nil(对于整数,则返回0,对于浮点值,不)。您可以取出所有if语句和两个返回路径,并且您的代码仍然可以以相同的方式工作。另外,我只使用alloc而不是allocWithZone。
答案 2 :(得分:0)
我不是100%。我也正在学习Mac / Iphone开发。但您可以使用自动释放池来帮助进行内存管理。它用于解决发布问题。
这是一篇关于memory management的文章。查看左侧菜单。