autoreleasepool-IOS 内存管理 AutoRelease问题

问题描述

IOS 内存管理 AutoRelease问题

如下两段代码, 为何第二段代码释放了内存之后还会有18.5MB的内存?? 而第一段就比较正常, 内存申请前和经过释放后差不多, 请指点~~~
创建的OS X的Command Line 工程, 不知是否会有区别于IOS

 int main(int argc, const char * argv[]) {
@autoreleasepool { //程序开始执行,内存为920KB
// insert code here...
@autoreleasepool {
            for (int i = 0; i < 1000000; i++) {
                @autoreleasepool {
                    NSString* str = [NSString stringWithUTF8String:"asdfasdfasdfsadf"];
                }
            }
            int i = 0; //经过不断申请和释放后, 内存为976KB, 基本差不多
        }
        NSLog(@"end"); //内存为1004KB
    }
    return 0;
}
 int main(int argc, const char * argv[]) {
@autoreleasepool { //程序开始执行,内存为920KB
// insert code here...
@autoreleasepool {
            for (int i = 0; i < 1000000; i++) {
NSString* str = [NSString stringWithUTF8String:"asdfasdfasdfsadf"];
            }
            int i = 0; //经过不断的内存申请, 已达到63MB
        }
        NSLog(@"end"); //此时, 上面申请的应该已经全部释放, 但是内存为18.5MB
    }
    return 0;
}

解决方案

自动释放池是等到它自己的大括号走完了才会释放,你的第一段demo,在你int i = 0时,里面的那个释放池已经是放过了,而外面的这个还没有释放,当然会有,你还不明白自动释放池的释放机制和手动释放的区别

时间: 2024-10-24 15:13:45

autoreleasepool-IOS 内存管理 AutoRelease问题的相关文章

iOS内存管理机制解析之MRC手动引用计数机制

前言: iOS的内存管理机制ARC和MRC是程序员参加面试基本必问的问题,也是考察一个iOS基本功是 否扎实的关键,这样深入理解内存管理机制的重要性就不言而喻了. iOS内存管理机制发展史 iOS 5以前 :MRC(手动引用计数) iOS 5及以后:ARC (自动引入计数) MRC机制时代 "谁开辟申请,谁及时合理释放" 面对自己申请的内存空间是要及时进行回收的: 不及时释放会造成什么结果? 对象存储在栈上,可能会大量的占用内存,内存不足造成程序闪退(也就是所说的内存泄露) 不合理释放

Cocos2d-x与ios内存管理分析(在游戏中减少内存压力)

  Cocos2d-x与ios内存管理分析(在游戏中减少内存压力) 猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网--Cocos2Dev.com,谢谢!  原文地址: http://www.cocos2dev.com/?p=281 注:自己以前也写过Cocos2d-x如何优化内存的使用,以及内存不足的情况下怎么处理游戏.今天在微博中看到有朋友介绍了下内存,挺详细的.不知道是谁写的,我记录下. 一,iOS与图片内存 在iOS上,图片会被自动缩放到2的N次方大小.比如一张1024*10

iOS 进阶—— iOS内存管理

1 似乎每个人在学习 iOS 过程中都考虑过的问题 alloc retain release delloc 做了什么? autoreleasepool 是怎样实现的? __unsafe_unretained 是什么? Block 是怎样实现的 什么时候会引起循环引用,什么时候不会引起循环引用? 所以我将在本篇博文中详细的从 ARC 解释到 iOS 的内存管理,以及 Block 相关的原理.源码. 2 从 ARC 说起 说 iOS 的内存管理,就不得不从 ARC(Automatic Referen

IOS有关内存管理的二三事

IOS有关内存管理的二三事 一.前引 随着移动设备的内存越来越大,程序员也已经度过了为了那一两M的内存在系统的抽丝剥茧的年代,对于JAVA的开发者,对内存更是伸手即取,并且从不关心什么时候还回去.但是,程序的掌控度对程序员来说是至关重要的,任何语言的内存管理机制的初衷也是在有限的空间里完成最精致的逻辑. 二.Xcode工程设置ARC ARC是xcode5中引入的自动引用计数,其原理与MRC是一样,只是系统帮助我们添加了retain和release.现在在xcode中新建的项目默认都是ARC的环境

《iOS应用开发》——2.3节内存管理

2.3 内存管理 iOS应用开发 我不是吓唬你们.在iOS 5.0系统之前,内存管理毫无疑问是iOS开发最困难的部分.简而言之,问题是这样的.无论何时你创建了一个变量,你就要在内存中给它分配一定的空间.对于局部变量来说,我们通常使用栈上的内存,这些内存是自动管理的,当函数返回时,函数中定义的任何局部变量都会从内存中自动删除. 这听起来很棒,但是栈有两个严重的局限.首先,它的空间非常有限,如果用尽了内存,应用程序就会崩溃.其次,这些变量很难共享.请记住,函数使用值传参和返回.这意味着所有传入函数或

IOS中内存管理那些事_IOS

Objective-C 和 Swift 语言的内存管理方式都是基于引用计数「Reference Counting」的,引用计数是一个简单而有效管理对象生命周期的方式.引用计数分为手动引用计数「ARC: AutomaticReference Counting」和自动引用计数「MRC: Manual Reference Counting」,现在都是用 ARC 了,但是我们还是很有必要了解 MRC. 1. 引用计数的原理是什么? 当我们创建一个新对象时,他的引用计数为1: 当有一个新的指针指向这个对象

ios-iOS 内存管理里面的 property 的语义属性

问题描述 iOS 内存管理里面的 property 的语义属性 iOS 内存管理里面的 property 的语义属性为retain时,它的内部做优化时,为什么最后又把新的实例变量再retain一次. setter方法if(_name != name){ [ _name release]_name = [name retain]:} 解决方案 property定义属性时,用retain等去修饰,其实就是再set方法里面进行相应处理,定义的retain就是告诉系统在set里面使用retain赋值.

iOS ARC 内存管理要点

前言 在讨论 ARC 之前,我们需要知道 Objective-C 采用的是引用计数式的内存管理方式,这一方式的特点是: 自己生成的对象自己持有.比如:NSObject * __strong object = [NSObject alloc] init];. 非自己生成的对象自己也能持有.比如:NSMutableArray * __strong array = [NSMutableArray array];. 自己持有的对象不再需要时释放. 非自己持有的对象自己无法释放. 而 ARC 则是帮助我们

iOS/OS X内存管理(一):基本概念与原理

在Objective-C的内存管理中,其实就是引用计数(reference count)的管理.内存管理就是在程序需要时程序员分配一段内存空间,而当使用完之后将它释放.如果程序员对内存资源使用不当,有时不仅会造成内存资源浪费,甚至会导致程序crach.我们将会从引用计数和内存管理规则等基本概念开始,然后讲述有哪些内存管理方法,最后注意有哪些常见内存问题.    memory management from apple document  基本概念 引用计数(Reference Count) 为了