【问题标题】:When is memory actually freed in Objective-C?Objective-C 中什么时候真正释放内存?
【发布时间】:2010-04-27 20:06:20
【问题描述】:

我正在尝试了解 Objective-C 中的内存管理内容。 如果我看到 Activity Monitor 列出的内存使用情况,看起来内存没有被释放(我的意思是 rsize 列)。但是在“对象分配”中,一切看起来都很好。 这是我的简单代码:

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];


NSInteger i, k=10000;
while (k>0) {
    NSMutableArray *array = [[NSMutableArray alloc]init];

    for (i=0;i<1000*k; i++) {
        NSString *srtring = [[NSString alloc] initWithString:@"string...."];
        [array addObject:srtring];
        [srtring release];
        srtring = nil;
    }

    [array release];
    array = nil;
    k-=500;

}

[NSThread sleepForTimeInterval:5];
[pool release];

return 0;
}

至于保留和释放很酷,一切都是平衡的。 但是 rsize 只有在退出这个小程序后才会减小。 是否可以在退出之前以某种方式“清理”内存?

【问题讨论】:

  • 请注意,在您的示例代码中,数组和字符串在池被耗尽或释放之前不会被释放。这发生在您的程序退出之前。也就是说,Williham 是正确的,系统可能不会立即回收内存。
  • 但是在 [pool release] 之​​后内存还在。
  • @Matt:你在做什么?从这里看起来好像数组是在外循环结束时释放的;不涉及自动释放,-[release] 是即时的。
  • 哦,悲伤,你是对的。我没有想。谢谢指正。

标签: objective-c memory-management


【解决方案1】:

在退出之前尝试清理内存没有意义;您正在退出,因此您拥有的任何稀疏资源都将返回给系统。

一个常见的误解是free()(释放的底层机制)立即将内存返回给系统;它不在大多数实现中,而是将其添加到内部空闲列表中;在其上保留内存供您的应用程序使用,但如果需要,则将其释放给系统。第二次循环循环时,您的应用程序会重用这些空闲内存来分配而不是向系统请求更多,从而使每个人的一切都更加顺畅。

【讨论】:

  • 感谢您的回答,但如果我现在不需要所有这些资源。让我们假设这段代码类似于一个主算法,然后只想查看结果而不退出我的程序?
  • 空闲内存可能会在稍后被系统回收;如果需要的话。空闲内存就是这样,免费的;它只是在必要时不会被系统回收。
  • 但是这个简单的代码可能会占用所有可用内存,我的意思是大约 1GB 或 2GB,但什么也没有发生。即使在 [pool release] 之​​后操作系统也会变慢,并且内存没有被释放。
  • 该代码仅占用几 MB 内存(我的系统为 78 MB),但它确实占用了所有单个处理器的容量;这可能就是您的系统正在爬行的原因。
  • 实际上,进一步的测试表明它的峰值约为 100MB(仍然不是很多,至少不是很多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多