【问题标题】:iOS ARC memory managementiOS ARC 内存管理
【发布时间】:2013-11-19 22:36:50
【问题描述】:

这可能是一个愚蠢的问题,但我正在努力解决循环中一些奇怪的内存增加问题。所以我想我可能对 ARC 有理解上的问题。

说,我有这样的功能:

+(NSString *)getDocPathToFile:(NSString *)filename{

NSFileManager *fileManager = [NSFileManager defaultManager];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *path = [documentsDirectory stringByAppendingPathComponent:fn];

    return path;
}

现在,像 fileManager、paths、documentsDirectory 和 path 这样的实例化变量会发生什么?在返回值后它们是否被销毁,因此不占用任何内存?

为了进一步解释这一点:我在循环中多次调用此方法。现在,在仪器中,我可以看到CFString (immutable) 中的内存不断增加,但我无法追踪分配 CFString 的位置(据我所知,我没有使用任何 CoreFoundation 东西)。我不确定上述函数是否是罪魁祸首,可能是完全不同的东西......

感谢您启发我... ;)

【问题讨论】:

  • 您的变量实际上很弱。该函数结束后将被 ARC 释放。该函数本身将创建一个新的 NSString 实例,您将把它分配给一个变量。内存将一直保留,直到不再指向该新字符串。
  • 太好了,感谢您的澄清...

标签: ios memory-management automatic-ref-counting


【解决方案1】:

您可以使用@autoreleasepool 来降低内存水印级别

例如

for (/**/) // some loop
{
    @autoreleasepool
    {
        // some code inside loop
    }
}

或者您可以将@autoreleasepool 放入您的方法中

+(NSString *)getDocPathToFile:(NSString *)filename{
    @autoreleasepool {
        NSFileManager *fileManager = [NSFileManager defaultManager];

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *path = [documentsDirectory stringByAppendingPathComponent:fn];

        return path;
    }
}

【讨论】:

    猜你喜欢
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多