iPhone内存调试

标签 iphone cocoa memory-management

我正在使用 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/

相关文章:

iphone - 如何创建标签或任何控件的镜像?

不同类型的 C++ 模板错误

memory-management - 电源 2 中 USB 设备的内存?

objective-c - 将我的 Mac 应用分发给 friend

objective-c - OCMock : Make a stub do something

objective-c - 从 `username` 给出的 `SecKeychainItemRef` 中提取 `SecKeychainFindGenericPassword` ?

python - 获取 postgresql 唯一日期的内存有效方式?

c# - 使用 C# 停止 Unity3d 中的线程

iphone - 两个坐标与 CoreLocation 之间的距离

ios - 有人真的知道时间吗? (哈!)