最近有时间,正好把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. 抓取锁的sql语句-第五次修改

    CREATE OR REPLACE PROCEDURE SOLVE_LOCK AS V_SQL VARCHAR2(3000); --定义 v_sql 接受抓取锁的sql语句V_SQL02 VARCHA ...

  2. AFN发送请求失败

    发送请求出现这个错误 Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Coc ...

  3. gdb调试 使用心得

    1: 对于在应用程序中加入参数进行调试的方法:   直接用 gdb app -p1 -p2 这样进行调试是不行的.   需要像以下这样使用:    #gdb app    (gdb) r -p1 -p ...

  4. mysql的limit经典用法及优化

    用法一   SELECT `keyword_rank`.* FROM `keyword_rank` WHERE (advertiserid='59') LIMIT 2 OFFSET 1;   比如这个 ...

  5. [xfire]使用xfire开发webservice的简单示例

    目前项目上有用到xfire,所以临时看了些xfire的资料和示例,自己照着写了一个简单示例. xfire在2007年后已经停止更新,正式更名为apache cxf,也可以说是xfire2.0. xfi ...

  6. MLlib-聚类

    聚类 例子 流聚类 例子 聚类 MLlib支持k-means聚类,一种最常用的聚类方法,将数据点聚成指定数据的簇.MLlib实现了一种k-means++的并行变种,叫做kmeansII.MLlib的实 ...

  7. Xcode7调试-b

    Xcode7中苹果为我们增加了两个重要的debug相关功能.了解之后觉得非常实用,介绍给大家. 1.Address Sanitizer: 妈妈再也不用担心 EXC_BAD_ACCESS? EXC_BA ...

  8. iOS App转让流程

    说法一: (1)选择转让APP (2)进入转让界面       点击Continue进入下一步   (3)输入对方的APP ID和Team ID     Apple ID 和 Team ID 可以在m ...

  9. MVC form post 传值

    http://www.cnblogs.com/firstcsharp/archive/2013/08/05/3238321.html @using (Html.BeginForm())参数示例 MVC ...

  10. PKUSC2016滚粗记

    Day0 坐飞机来北京,地铁上接到电话,以为是诈骗电话马上就挂了,然后看了一下是北京的电话,赶脚有点不对...打回去居然是报到处老师的电话..走了几个小时,到勺园和其他学校的神犇合住.TAT,感觉第二 ...