最近有时间,正好把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. firebug中console命令尝试

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 将从网上下载下来的javaweb项目继续配置

    1.将下载下来的项目,看有没有报错,这里推荐的是不变成web项目的方法,直接通过编译到服务器目录 2.报错的问题,一般是包,服务器的包,(tomcat-home)指向自己的bin目录 3.然后是添加s ...

  3. leetcode修炼之路——83. Remove Duplicates from Sorted List

    哈哈,我又来了.昨天发现题目太简单就没有放上来,今天来了一道有序链表的题.题目如下: Given a sorted linked list, delete all duplicates such th ...

  4. linux下系统定时任务配置----crontab(mysql定时备份)

    crontab命令用于设置周期性被执行的指令,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任 ...

  5. linux File Handling commands 'ls'.

    ref:Linux / Unix Command: ls NAME ls - list directory contents SYNOPSIS ls [OPTION]... [FILE]... DES ...

  6. SQL SERVER 2012疑难问题解决方法

    问题一: 问题描述 SQL SERVER 2012 尝试读取或写入受保护的内存.这通常指示其他内存已损坏. (System.Data) 解决办法 管理员身份运行 cmd ->  输入 netsh ...

  7. iOS开发之Quartz2D详解

    1. 什么是Quartz2D? Quartz 2D是一个二维绘图引擎,同时支持iOS和Mac系统 Quartz 2D能完成的工作 绘制图形 : 线条\三角形\矩形\圆\弧等 绘制文字 绘制\生成图片( ...

  8. python challenge 16

    前情回顾:上一篇 第16关地址 打开16关,又是一张奇奇怪怪很多点点的图片,应该又是与PIL库有关的. 页面的标题是:let me get this straight.这是英语中的一句俚语,意思是让我 ...

  9. 关于jQuery表单校验的应用

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  10. MySql存储过程—2、第一个MySql存储过程的建立

    看看如何创建一个存储过程.虽然通过命令行可以创建,但基本通过MySQL提供的Query browser来创建. 1.首先我们通过Administrator在test数据库中创建一个简单的表名叫”pro ...