戏言:

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. 使用grub手动引导linux和windows

    引导Linux 重启进入到grub菜单界面时,按“c”键进入grub命令模式.1.指定/boot所在的分区,比如分区是第一块硬盘第一分区,即hd0,0 grub> root (hd0,0) 2. ...

  2. C++ 第一次课堂作业

    GitHub链接: 传送门 题目描述 Create a program that asks for the radius of a circle and prints the area of that ...

  3. Alpha版本十天冲刺--Day4

    站立式会议 会议总结 队员 今天完成 遇到的问题 明天要做 感想 鲍亮 解决线程信息传递问题(使用函数回调),Android登录验证接口完善 无 json解析,忘记密码界面验证码获取接口,忘记密码请求 ...

  4. 软件产品案例分析——K米

    第一部分 调研.评价 调研 测试机型:iPhone 6s K米版本:4.3.0 直观感受 界面干净,功能丰富,操作不复杂,易上手 错误类 无法分享KTV主页 步骤:进入KTV主页,点击右上角分享图标 ...

  5. Android shell 下 busybox,clear,tcpdump、、众多命令的移植

    http://my.oschina.net/mopidick/blog/167372 作为一名Android开发者,经常需要进入Android 的shell终端运行一些命令.但是我们发现Android ...

  6. runtime使用小例子 - 给对象O-C属性赋值

    这些日子在家里学习runtime,看runtime的一些方法和前辈们的博客,我也尝试着写几个runtime有效的运用 一.给对象属性赋值,例如一个WebEntity类 她有三个属性:NSString. ...

  7. JZOJ P1817:[8.27]研究性学习作业

    传送门 老师良心推荐的二分题.7月29号第一次写,想到了裸的DP,乱搞搞过了6组,欲优化,无解,弃疗. 然后今天老师给了题解,简单看了一下. 正解是二分答案+DP验证. 二分天数$day$,然后对于每 ...

  8. python运维开发之路02

    年底事多,在公司忙成狗,难得把博客更新了下 本章主要内容是collections模块的介绍(队列,计数器,默认字典,有序字典,可命名元组,以及简单介绍深浅拷贝!) collections模块 coll ...

  9. 机器学习笔记—Logistic回归

    本文申明:本系列笔记全部为原创内容,如有转载请申明原地址出处.谢谢 序言:what is logistic regression? Logistics 一词表示adj.逻辑的;[军]后勤学的n.[逻] ...

  10. CSS-混合布局的几种方法(正确的方法和错误的原因)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...