iOS内存管理(一)
最近有时间,正好把iOS相关的基础知识好好的梳理了一下,记录一下内存相关方面的知识。
在理解内存管理之前我觉得先对堆区和栈区有一定的了解是非常有必要的。
栈区:就是由编译器自动管理内存分配,释放过程的区域,存放函数的参数值,局部变量等。栈是内存中一块连续的区域,它的大小是确定的。
堆区:需要我们来动态的分配,释放,也就是我们内存管理的主角。
我们通过一个简单的例子来看看。
NSString *string = [NSString alloc] init];
我们声明了一个NSString类型的变量并为它开辟了空间,并让一个NSString类型的指针string指向我们开辟的空间。指针string本身是存储在栈区里的,&string就是这个string指针在栈中的地址,而这个string指针指向的就是我们在堆空间开辟的NSString对象的地址。在OC中,所有对象其本质都是结构体(结构体的大小无法动态改变,这也是为什么category无法添加成员变量的原因),因此*string就是这个NSString对象的结构体。总结一下就是当你声明一个对象时,这个对象的指针是存储在栈区中的,系统通过栈区中的对象指针去找到在堆区中的对象本身。
在结束了上面的话题后我们再来看另外一个问题。当我们指针和对象的关系是一对一的时候我们可以很好的解释内存管理的问题,那么当我们同时有两个指针指向同一个对象,甚至多个指针指向同一个对象时该怎么管理我们的内存空间呢?
NSMutableString *strA = [[NSMutableString alloc] initWithFormat:@"内存管理"];
NSMutableString *strB = [strA retain];
NSLog(@"strA : %@",strA);
NSLog(@"指针指向的地址 objcA:%p, objcB:%p",strA,strB);
NSLog(@"指针本身的地址 objcA:%p, objcB:%p",&strA,&strB);
NSLog(@"retainCount objcA:%d, objcB:%d",[strA retainCount],[strB retainCount]);
[strA release];
NSLog(@"retainCount objcA:%d, objcB:%d",[strA retainCount],[strB retainCount]);
我们定义了两个NSMutableString类型的指针strA和strB,但实质上指针strA和strB同时指向了同一个NSMutableString对象。在这种情况下,如果当strA使用完后立即释放对象内存,那么strB再去访问该对象时就会出现问题,而应付这种情况时就是iOS内存管理大展身手的时候了。iOS的内存管理机制是通过“引用计数器”(retainCount)实现的,在我的理解看来一个对象的retainCount数就是当前有多少个指针正指向该对象,例子中的NSobject对象由于同时被指针strA和strB指向,因此该对象的retainCount就是2。[strA release]是什么意思呢?这个方法就是告诉系统,strA对对象的使用已经完毕了,此时该对象的retainCount会被减一,运行结果如下。
总结一下就是iOS之所以需要内存管理机制是因为在iOS中一个对象和指向这个对象的指针是分别存储在内存中的堆区和栈区的,因此为了保证一个对象不会在错误的时间被错误的释放,从而导致栈区中的指针在访问对象时出现对象已被释放的问题,iOS引入了retainCount来控制对象的释放时机。retainCount数从本质上来说就是当前对象正在被多少个指针指向。弄明白了这些我们在使用retain,assign,strong,weak,copy这些关键字时就能够能好的理解它们所代表的含义了。
iOS内存管理(一)的更多相关文章
- iOS内存管理
iOS内存管理的方式是引用计数机制.分为MRC(人式引用计数)和ARC(自动引用计数). 为什么要学习内存管理? 内存管理方式是引用计数机制,通过控制对象的引用计数来实现操作对象的功能.一个对象的生命 ...
- 【Bugly干货分享】iOS内存管理:从MRC到ARC实践
Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...
- iOS内存管理个人总结
一.变量,本质代表一段可以操作的内存,她使用方式无非就是内存符号化+数据类型 1.保存变量有三个区域: 1>静态存储区 2>stack 3>heap 2.变量又根据声明的位置有两种称 ...
- IOS内存管理学习笔记
内存管理作为iOS中非常重要的部分,每一个iOS开发者都应该深入了解iOS内存管理,最近在学习iOS中整理出了一些知识点,先从MRC开始说起. 1.当一个对象在创建之后它的引用计数器为1,当调用这个对 ...
- iOS内存管理编程指南
iOS 内存管理 目录[-] 一:基本原则 二:成员变量的内存管理 三:容器对象与内存管理 四:稀缺资源的管理 五:AutoRelease 六:其他注意事项 iOS下内存管理的基本思想就是引用计数,通 ...
- iOS内存管理 ARC与MRC
想驾驭一门语言,首先要掌握它的内存管理特性.iOS开发经历了MRC到ARC的过程,下面就记录一下本人对iOS内存管理方面的一些理解. 说到iOS开发,肯定离不开objective-c语言(以下简称OC ...
- 75.iOS内存管理
堆区和栈区 1.栈区:由编译器自动分配释放,函数的参数值,局部变量等值 2.堆区:一般由开发人员分配释放,若不释放,则可能会引起内存泄漏 NSString *string = @"abcd& ...
- iOS 内存管理-copy、 retain、 assign 、readonly 、 readwrite、nonatomic、@property、@synthesize、@dynamic、IB_DESIGNABLE 、 IBInspectable、IBOutletCollection
浅谈iOS内存管理机制 alloc,retain,copy,release,autorelease 1)使用@property配合@synthesize可以让编译器自动实现getter/setter方 ...
- iOS内存管理策略和实践
转:http://www.cocoachina.com/applenews/devnews/2013/1126/7418.html 内存管理策略(memory Management Policy) N ...
随机推荐
- android背景平铺方式 tileMode
创建重复的背景图片 在drawable目录下创建一个repeat_bg.xml: 然后在布局的xml文件中可以这样引用: ================================ ...
- java中判断两个字符串是否相等的问题
我最近刚学java,今天编程的时候就遇到一个棘手的问题,就是关于判断两个字符串是否相等的问题.在编程中,通常比较两个字符串是否相同的表达式是“==”,但在java中不能这么写.在java中,用的是eq ...
- Linux下svn命令switch用法
# svn info /data/www/49you/api.49you.com Path: /data/www/49you/api.49you.comURL: svn://192.168.10.81 ...
- IOS常用CGRect的交错,边缘,中心的检测
转自:http://tsyouaschen.iteye.com/blog/1946957 判断给定的点是否被一个CGRect包含,可以用CGRectContainsPoint函数 BOOL conta ...
- C#简单一句代码,实现pictureBox的照片另存为磁盘文件不出错
开发人事档案系统时,一般都要利用pictureBox对人员的照片进行操作,包括选择保存照片.另存照片.删除照片,如下图: 将照片保存到数据库和从数据库中删除,网友写了很多实用代码,非常好用.但是要将p ...
- js bind
1.作用 函数的bind方法用于将函数体内的this绑定到某个对象,然后返回一个新函数. //bind 相比于call apply this 都等于 obj; bind是产生一个新的函数 不执 ...
- Java基础--IO
1,流的认识和分类 2,Java种处理流的IO类架构 3,字节流和字符流转换 4,NIO的概述 5,Java IO关闭资源 1,流的认识和分类 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的 ...
- Specified VM install not found: type Standard VM, name jdk1.6.0_05
重装系统换了jdk,之前jdk用的1.6,现在改成1.7了.但是更新之后发现ant打包用不了了,报错 Specified VM install not found: type Standard VM, ...
- Ppthon基础学习之Dict
一.什么是字典? 字典是Python语言中唯一的映射类型. 映射类型对象里哈希值(键,key)和指向的对象(值,value)是一对多的的关系,通常被认为是可变的哈希表. 字典对象是可变的,它是一个容器 ...
- HDU1276(士兵队列训练模拟与链表)
HDU1276 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descripti ...