代码之家  ›  专栏  ›  技术社区  ›  Rob

iPhone内存调试

  •  1
  • Rob  · 技术社区  · 16 年前

    我正在使用工具试图确定我的应用程序中是否有地方可以更有效地使用内存。我花时间对仪器有点熟悉,但我通常是一个新手,具有来自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 回复  |  直到 16 年前
        1
  •  4
  •   Tony    16 年前

    这个方法在循环中经常被调用吗?只有当自动释放对象所在的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];
    

    在该示例中,当前池每10000次迭代发布一次,并创建一个新的池。您可以在 Memory Management Programming Guide 有关自动释放池的部分。

        2
  •  0
  •   Marc Charbonneau    16 年前

    无论如何,您需要返回一个自动释放的对象,所以对于结果字符串您实际上不应该做任何事情。我看不到任何与内存相关的错误,但您的代码肯定比需要的要详细。请记住,在objective-c中,如果对nil调用方法,则返回nil(对于整数,返回0,但是 对于浮点值)。您可以去掉所有那些if语句和这两个返回路径,您的代码仍将以相同的方式工作。另外,我只使用alloc而不是allocWithZone。

        3
  •  0
  •   J.J.    16 年前

    我对这个不是百分之百的。我也在学习Mac/iPhone开发。但是您可以使用自动释放池来帮助管理内存。它用于解决释放问题。

    这是一篇关于 memory management . 查看左侧菜单。