Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Objective-C中,什么时候实际释放内存?_Objective C_Memory Management - Fatal编程技术网

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

在Objective-C中,什么时候实际释放内存?,objective-c,memory-management,Objective C,Memory Management,我试图理解Objective-C中的内存管理内容。 如果我看到Activity Monitor列出的内存使用情况,看起来内存没有被释放(我指的是rsize列)。但在“对象分配”中,一切看起来都很好。 以下是我的简单代码: #import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] i

我试图理解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;
}
#导入
int main(int argc,const char*argv[]{
NSAutoreleasePool*池=[[NSAutoreleasePool alloc]init];
NSInteger i,k=10000;
而(k>0){
NSMUTABLEARRY*array=[[NSMUTABLEARRY alloc]init];

对于(i=0;i在退出之前尝试清除内存没有意义;您正在退出,因此您拥有的任何稀疏资源都将返回到系统


一个常见的误解是
free()
(发布的基本机制)立即将内存返回到系统;在大多数实现中不会,而是将其添加到内部空闲列表中;在该列表中,内存保留在应用程序使用的位置,但在需要时释放到系统中。循环第二次循环时,应用程序将重用此空闲内存,以便从中分配而不是请求从系统中获取更多信息,使每个人的工作都更加顺畅。

请注意,在示例代码中,数组和字符串在池被耗尽或释放之前不会被释放。这发生在程序退出之前。也就是说,Williham是正确的,系统可能不会立即回收内存。但内存仍然存在在[pool release]之后释放。@Matt:你在说什么?从这里看,数组似乎是在外循环的末尾释放的;没有涉及自动释放,
-[release]
立即生效。哦,格里菲,你说得对。我没在想。谢谢你的更正。谢谢你的回答,但如果我现在不需要所有这些资源。让我们想象一下,这段代码就像一个主算法,然后只想在不退出我的程序的情况下查看结果?空闲内存可能会很快被回收稍后由系统来说明;如果需要的话。空闲内存就是这样,空闲的;在必要之前系统不会回收它。但是这个简单的代码可能会占用所有的空闲内存,我的意思是大约1GB或2GB,并且什么都没有发生。操作系统在[池释放]后速度会变慢,内存也不会被释放。代码只占用几MB内存,(在我的系统上为78MB),但它确实占用了所有单处理器的容量;这可能就是您的系统正在爬行的原因。实际上,进一步的测试表明,它的峰值约为100MB(尽管不是很多,但至少不是很多)。