戏言:

iOS开发已经到了一个ARC时代,一般不需要我们过多的去关注内存是怎么分配,怎么管理的。很长一段时间,我也不知道内存管理是什么鬼,但如果遇到这方面的问题,却找不到解决办法确实很头疼的。So,还是静下心来,好好学习吧,毕竟内功才是体现水平。

1. 引用计数
            对于一块动态申请的内存,有一个人(指针)使用,就给这个内存的计数器加1,使用完成后,就给这个计数器减1,当这个内存的引用计数为0了,我们再释放他,这样,上面的问题就解决了。OC,就是使用引用计数这种方式来管理内存的。

生动的理解就是:举一个生活中的例子,我们一起去水库边烧烤,我把火点着了,当我们正在“水深火热”的烤着肉,一个电话来了,媳妇让我回家。于是,我跟你们说,你们懂的,哥要回去了,为了防止引发火灾,我要把火扑灭了。我相信,此时你们打死我的心都有。
        我们能不能想到更好的方法,我不浇灭火,又不会引起火灾?
        计数,虽然火是我生的,但我们有10个人一起用。那么,这堆火的计数为10,如果我,或者任何一个同学走了,让计数减1,变成9,8,7...这样,直到最后一个同学走,他在走之前将火灭了就好了。            这就是OC的内存管理方式,引用计数。

2.内存管理的黄金法则
            对于引用计数来说,有一套内存管理的黄金法则:
            The basic rule to apply is everything that increases the reference counter with alloc, [mutable]copy[withZone:] or retain is in charge of the corresponding [auto]release.
         只要使用了alloc/retain/copy/mutableCopy, 创建了对象
    那么就必须使用release进行释放,
        ———谁创建,谁负责释放

3.retain与retainCount
        retain,将对象进项保留操作,也就是使对象的引用计数加1。
        retainCount,打印一个对象的引用计数。


       DSDog*dog=[[DSDog alloc]init];
NSLog(@"%lu",[dog retainCount]);//1 含有init,引用计数加1
DSDog *dog2=[dog retain]; NSLog(@"%lu",[dog2 retainCount]);//2 对象retain,引用计数加1
[dog2 release];
NSLog(@"%lu",[dog2 retainCount]);//1 release,引用计数减1
[dog release]; // 变为0 ,销毁对象

4.MRC和ARC
            ARC   (Automatic Reference Counting),自动引用计数,由xcode,帮我们去管理内存。
            MRC  (Manual  Reference Counting),手动引用计数,我们手动管理内存。

Xcode 5.0  以后的版本默认是ARC模式

工程创建的时候是ARC的,我们如果想要MRC,需要进行如下设置。
            选中工程 - target - Bulid Settings - 搜索:automatic reference counting或auto,将Objective-C Automatic Reference Counting改为NO。

5.@property retain,assign,copy展开

5.1@property (nonatomic, retain) DSDog *dog; 用来修饰ObjC对象。

则会展开如下:
       - (void)setDog:(DSDog *)dog
        {
                if (_dog != dog)
                {
                        [_dog release];
                        _dog = [dog retain];
                }
        }
5.2 assign展开:简单数据类型

@property (nonatomic, assign) DSDog *dog;

assign是直接复制,则会展开如下:
    //简单数据类型 ,OC的内存管理对于简单的数据类型 int\float…, OC无效
    - (void)setDog:(DSDog *)dog
    {
        _dog = dog;
    }

5.3 copy展开  , 复制一份原来的对象

//copy 多用于字符串,Dict、Array
    @property (nonatomic, copy)NSString *name;
    - (void)setName:(NSString *)name
    {
        if (_name != name)
        {
            [_name release];
            _name = [name copy];
        }
    }
6.自动释放池

原理:对象接收到autorelease消息时,它会被添加到了当前的自动释放池中,当自动释放池被销毁时,会給池里所有的对象发送release消息。

ObjC提供两种方法创建自动释放池:
  方法一:使用NSAutoreleasePool来创建

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc]init];
//这里写代码
[pool release];
方法二:使用@autoreleasepool创建
  @autoreleasepool {
//这里写代码
} 7.weak:ARC新引入修饰词,可代替assign,比assign多增加一个特性
strong:ARC新引入修饰词,可代替retain
 

OC第七节——内存管理的更多相关文章

  1. 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理

    1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...

  2. OC语言-05-OC语言-内存管理

    一.引用计数器 1> 栈和堆 栈 ① 主要存储局部变量 ② 内存自动回收 堆 ① 主要存储需要动态分配内存的变量 ② 需要手动回收内存,是OC内存管理的对象 2> 简介 作用 ① 表示对象 ...

  3. OC基础15:内存管理和自动引用计数

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 1.什么是ARC? (1).ARC全名为A ...

  4. oc 第五天(内存管理)

    OC的重点: 内存管理 1 基本原理     OC的内存回收机制是和JAVA的自动回收机制是不同的,它有两种模式,或者准确的说是同 一种模式的两种不同体现,下面简单总结下. 1手动内存回收       ...

  5. OC学习篇之---内存管理介绍和使用

    在之前的一片文章我们说了OC中谓词操作:http://blog.csdn.net/jiangwei0910410003/article/details/41923507,从今天开始我们就来看一下OC中 ...

  6. 第七章 内存管理单元MMU介绍

    7.1 内存管理单元MMU介绍 7.1.1 S3C2410/S3C2440 MMU特性 负责虚拟地址到物理地址的映射,并提供硬件机制的内存访问权限检查 特性: 与ARM V4兼容的映射长度.域.访问权 ...

  7. Android Training精要(七)内存管理

    在2.3.3及以下版本: 通過定義兩個整形變量來檢測bitmap是否display過或者已經在緩存中 下面的代碼當bitmap滿足兩個條件就被回收掉: 1. 兩個整形變量都變為0 2. bitmap不 ...

  8. block本质探寻七之内存管理

    说明: <1>阅读本问,请参照block前述文章加以理解: <2>环境:ARC: <3>变量类型:基本数据类型或者对象类型的auto局部变量: 一.三种情形 //代 ...

  9. 重读金典------高质量C编程指南(林锐)-------第七章 内存管理

    2015/12/10补充: 当我们需要给一个数组返回所赋的值的时候,我们需要传入指针的指针.当我们只需要一个值的时候,传入指针即可,或者引用也可以. 结构大致如下: char* p = (char*) ...

随机推荐

  1. A.Kaw矩阵代数初步学习笔记 1. Introduction

    “矩阵代数初步”(Introduction to MATRIX ALGEBRA)课程由Prof. A.K.Kaw(University of South Florida)设计并讲授. PDF格式学习笔 ...

  2. Error=Bias+Variance

    首先 Error = Bias + Variance Error反映的是整个模型的准确度,Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,Variance反映的是模型每一次输 ...

  3. rabbitmq因为主机名更改导致连接不上

    今天创建rabbitmq用户的时候报错,说nodedown,定睛一看,发现主机名是localhost,而此时我们的主机名是controller01,所以猜测是主机名导致的,重启服务器,就成功添加了. ...

  4. Objective 多态

    多态的特点 1.没有继承就没有多态 2.代码的体现:父类类型的指针指向子类对象 3.好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了. ...

  5. uC/OS-II邮箱(mbox)块

    /*************************************************************************************************** ...

  6. python学习笔记-(七)python基础--集合、文件操作&函数

    本节内容 1.集合操作 2.文件操作 3.字符编码与转码 4.函数操作 1.集合操作 集合是一个无序的.不重复的数据组合: 1.1 常用操作 它的作用是: 1)自动去重:列表变成集合,自动去重: &g ...

  7. Axure7.0汉化方法

    下载汉化包 AxureRP7CN_汉化包.rar 首先退出正在运行中的 Axure (如果您正在使用). 将 汉化包.rar 文件解压, 得到 lang 文件夹,  然后将其复制到 Axure 安装目 ...

  8. 使用Newtonsoft JsonConvert反序列化Json数据到DataTable

    //JsonStr为Json字符串 JArray array = JsonConvert.DeserializeObject(JsonStr) as JArray;//反序列化为数组 ) { Stri ...

  9. linux redhat6.4安装oracle11g

    系统要求 1. Linux安装Oracle系统要求 系统要求 说明 内存 必须高于1G的物理内存 交换空间 一般为内存的2倍,例如:1G的内存可以设置swap 分区为3G大小 硬盘 5G以上  2.修 ...

  10. Flask-WTF form doesn't have attribute 'validate_on_submit'问题

    今天在学习WTF表单的时候遇到了这个问题,在stackoverflow上搜索查到了解决方案 from flask.ext.wtf import Form from wtforms import Tex ...