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 ...
随机推荐
- Sniffer抓包教程
上网络信息安全的时候用了下,中途出现了一堆奇葩的事,这里就不提了... 上教程: 先把虚拟机里面的防火墙给关了,主机防火墙也关了 之前由于ip自己设置了,然后一直ping不通,后面把ip改成自动获取就 ...
- HTML5 离线缓存详解(转)
离线缓存是html5新特性之一,简单理解就是第一次加载后将数据缓存,在没有清除缓存前提下,下一次没有网络也可以加载,用在静态数据的网页或游戏比较好用.当然,Html5新的特性都不是所有浏览器都能支持的 ...
- C#word(2007)操作类--新建文档、添加页眉页脚、设置格式、添加文本和超链接、添加图片、表格处理、文档格式转化
转:http://www.cnblogs.com/lantionzy/archive/2009/10/23/1588511.html 1.新建Word文档 #region 新建Word文档/// &l ...
- android对象序列化Parcelable浅析
一.android序列化简介 我们已经知道在Android使用Intent/Bindler进行IPC传输数据时,需要将对象进行序列化. JAVA原本已经提供了Serializable接口来实现序列化, ...
- 【转】iOS6中的Auto Layout:通过代码添加约束
最近做的项目用到了Auto Layout,于是经过了一番大量的google,这是我看到的讲用代码创建约束最清晰的一篇教程,于是想跟更多的人分享一下.原文也比较简单,可以直接过去看,如果我翻译的 ...
- bootstrap导航条
<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>我的 ...
- (转)QT常用快捷键
F1 查看帮助F2 跳转到函数定义(和Ctrl+鼠标左键一样的效果)Shift+F2 声明和定义之间切换F4 头文件和源文件之间切换Ctrl+1 ...
- java获得系统当前日期
package com.web.test; import java.text.ParseException; import java.text.SimpleDateFormat; import jav ...
- JQuery 左右拖动插件
js文件:http://hokaccha.github.io/js-flipsnap/js/flipsnap.js 官网: http://hokaccha.github.io/js-flipsnap/
- bzoj2487: Super Poker II
Description I have a set of super poker cards, consisting of an infinite number of cards. For each p ...