什么时候在Objective-C中实际释放了内存?

时间:2010-04-27 20:06:20

标签: objective-c memory-management

我正在尝试了解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才会减少。 是否有可能在退出前以某种方式“清理”记忆?

1 个答案:

答案 0 :(得分:2)

在退出之前试图擦洗内存没有意义;你要退出,所以你拥有的任何稀疏资源都会返回给系统。

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