iPhone内存调试

时间:2009-01-09 19:39:08

标签: iphone cocoa memory-management

我正在使用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库调用将返回一个自动释放的对象,所以我无法“手动”管理它。有点不确定如何优化这种方法。

3 个答案:

答案 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的文章。查看左侧菜单。