最近有时间,正好把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内存管理(一)的更多相关文章

  1. iOS内存管理

    iOS内存管理的方式是引用计数机制.分为MRC(人式引用计数)和ARC(自动引用计数). 为什么要学习内存管理? 内存管理方式是引用计数机制,通过控制对象的引用计数来实现操作对象的功能.一个对象的生命 ...

  2. 【Bugly干货分享】iOS内存管理:从MRC到ARC实践

    Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...

  3. iOS内存管理个人总结

    一.变量,本质代表一段可以操作的内存,她使用方式无非就是内存符号化+数据类型 1.保存变量有三个区域: 1>静态存储区 2>stack 3>heap 2.变量又根据声明的位置有两种称 ...

  4. IOS内存管理学习笔记

    内存管理作为iOS中非常重要的部分,每一个iOS开发者都应该深入了解iOS内存管理,最近在学习iOS中整理出了一些知识点,先从MRC开始说起. 1.当一个对象在创建之后它的引用计数器为1,当调用这个对 ...

  5. iOS内存管理编程指南

    iOS 内存管理 目录[-] 一:基本原则 二:成员变量的内存管理 三:容器对象与内存管理 四:稀缺资源的管理 五:AutoRelease 六:其他注意事项 iOS下内存管理的基本思想就是引用计数,通 ...

  6. iOS内存管理 ARC与MRC

    想驾驭一门语言,首先要掌握它的内存管理特性.iOS开发经历了MRC到ARC的过程,下面就记录一下本人对iOS内存管理方面的一些理解. 说到iOS开发,肯定离不开objective-c语言(以下简称OC ...

  7. 75.iOS内存管理

    堆区和栈区 1.栈区:由编译器自动分配释放,函数的参数值,局部变量等值 2.堆区:一般由开发人员分配释放,若不释放,则可能会引起内存泄漏 NSString *string = @"abcd& ...

  8. 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方 ...

  9. iOS内存管理策略和实践

    转:http://www.cocoachina.com/applenews/devnews/2013/1126/7418.html 内存管理策略(memory Management Policy) N ...

随机推荐

  1. python函数的使用和返回值

    #coding=utf-8 def a(): i=1a() #函数的返回值,用return语句实现 #一个返回值的情况def test(): i=7 return iprint test() #多个返 ...

  2. JavaScript--动态更改CSS样式

    JavaScript太强大了,虽然是弱语言,不过一点都不输于Java 可以自行设置随机数,来动态更改CSS样式,每一次都是不一样的感觉,这个小功能挺实用的 <!DOCTYPE html> ...

  3. CSS入门学习(转)

    一.基础学习 1.何为CSS CSS是Cascading Style Sheets(层叠样式表)的简称,是一种标记语言,它不需要编译,可以直接由浏览器执行(属于浏览器解释型语 言). CSS文件也可以 ...

  4. java 项目request.getParameter("")接收不到值

    如果发现这个方法 以前能接收到参数,现在不能接收到参数的情况下 很有问题出来tocat 或许jak 的问题上, 换个低版本可能就好了

  5. (转)Thinkphp系统常量 演示

    Thinkphp2.1框架内置了许多系统常量, 具体如下: __ROOT__ : 网站根目录地址 __APP__ : 当前项目(入口文件)地址 __URL__ : 当前模块地址 __ACTION__  ...

  6. Java多线程和线程池

    转自:http://blog.csdn.net/u013142781/article/details/51387749 1.为什么要使用线程池 在Java中,如果每个请求到达就创建一个新线程,开销是相 ...

  7. aborb()程序结束形式

    abort()与exit()的区别?         分类:             MFC              2011-01-04 14:13     2233人阅读     评论(0)   ...

  8. 妙用git rebase --onto指令

    有时候,在分支提交更改的时候,会忘记rebase,就直接提交上去,或者忘记和本地远程分支做merge,就直接rebase了别的分支.有时候真希望有一种切片的方式,让自己的分支只需要接上某一段.这个时候 ...

  9. Python标准库--os模块

    这个模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.即它允许一个程序在编写后不需要任何改动,也不会发生任何问题,就可以在Linux和Windows下运行.一个例 ...

  10. javascript权威指南学习笔记2

    Javascript语言核心(2~12章) 第三章:类型.值.变量 1.数字: overflow(Infinity, -Infinity).underflow(+0,-0) 非数字值:它和任何值都不相 ...