一、引用计数器

1> 栈和堆

  1. 栈

    ① 主要存储局部变量
    ② 内存自动回收
  2. 堆

    ① 主要存储需要动态分配内存的变量
    ② 需要手动回收内存,是OC内存管理的对象

2> 简介

  1. 作用

    ① 表示对象被引用的次数
    ② 通常由alloc、new、copy与release方法引发
    ③ 动态监测引用计数器的值,当值为0时回收对象所占的内存
  2. 使用注意

    ① 引用计数器一个NSUInteger类型的变量,占用4字节内存
    ② 在对象被创建的时候引用计数器的值被初始化为1
    ③ 每个使引用计数器加1的操作,都有一个引用计数器减1的操作与之
    对应

3> 基本概念

  1. 僵尸对象

    ① 所占用的内存已经被回收的对象
    ② 僵尸对象不能再被使用
  2. 野指针

    ① 指向僵尸对象的指针
    ② OC中引用野指针会报错,错误信息:EXC_DAB_ACCESS
  3. 空指针

    ① 没有指向任何内存地址的指针
    ② 空指针的值通常为nil、NULL或0
    ③ 通常在创建指针时将其初始化,避免其指向不确定的内存
    ④ 在对象被销毁后,通常要将指向对象的指针赋值为nil,避免产生野
    指针

4> 基本方法

  1. retain

    ① 使引用计数器加1
    ② alloc、new、copy等方法会自动调用retain方法
    ③ 每个retain方法都必须对应一个release方法
    ④ 返回值为对象本身
  2. release

    ① 使引用计数器减1
    ② 没有返回值
    ③ 用空指针调用release方法不会报错
    ④ 不是经过alloc方法创建的对象,不需要执行release操作
  3. dealloc

    ① 在对象被销毁时调用
    ② 通常需要重写dealloc方法
    ③ 重写dealloc方法时,必须在最后调用父类的dealloc方法
    ④ @property不会影响dealloc方法,只会影响色图特人和getter

二、多对象内存管理

1> 基本使用

  • 当拥有某个对象时,就对该对象执行retain操作
  • 当抛弃某个对象时,就对该对象执行release操作
  • 谁执行retain操作,谁就执行release操作

2> set方法的内存管理

  1. 基本使用

    ① 当set方法的参数是OC对象时,通常要在set方法内实现内存管理
    ② 当参数与成员变量不一样时,才对成员变量执行release操作,对
    参数执行retain
  2. set方法的代码规范

    ① 基本数据类型:直接赋值
    ② OC对象类型
    )先判断是不是新对象
    )若是,对就对象执行一次release操作,对新对象执行一次retain
    操作
    )否则,不执行操作
  3. dealloc方法的代码规范

    ① 对self拥有的所有对象执行一次release操作
    ② 一定要调用父类的dealloc方法,且放在最后
    ③ 在ARC环境下重写dealloc方法不能调用父类的dealloc方法

3> @property对内存的影响

  1. 基本使用

    ① 为成员变量生成setter和getter
    ② 默认生成的setter执行的是直接赋值,不涉及内从管理
    ③ 若setter的参数是OC对象,需要设置@property的参数,使其生成
    内存管理代码
  2. @property的参数

    ① 内存管理相关参数
    )retain:release旧对象,retain新对象(适用于OC对象类型)
    )assign:直接赋值(默认,适用于非OC对象)
    )copy:release旧对象,copy新对象 ② 控制成员变量属性的参数
    )readwrite:同时生成setter和getter的声明、实现
    )readonly:只会生成getter的声明、实现 ③ 多线程管理相关参数
    )nonatomic:生成setter方法时不加线程管理代码,性能高
    (一般用这个)
    )atomic:生成setter方法时加上线程管理代码,性能低(默认) ④ 指定setter和getter名称的参数
    )通过setter指定生成的set方法的名称,通过getter指定生成的
    get方法的名称
    )不影响点语法的使用,点语法在使用时先转换为对应的set或get
    方法
    )通常当get方法的返回值为BOOL类型数据时,对get方法使用,
    set方法几乎不用

4> 循环包含与循环引用

  1. 循环包含

    ① 但两个类的声明文件循环包含时,通常要在一个文件中用@class
    声明另一个类
    ② 使用规范
    )在.h文件中用@class声明类
    )在.m文件中用#import包含类的声明文件
  2. 循环引用

    ① 当两个OC类循环引用时,会产生内存管理问题
    ② 解决方法
    )在一个类的声明中,指定@property的内存管理参数为retain
    )在另一个类的生命中,指定@property的内存管理参数为release

三、autorelease

1> 基本使用

  1. 作用

    ① 将调用该方法的对象放进自动释放池,当池子销毁时,对池子内所有
    的对象执行一次release操作
    ② 通常在对象创建时调用,放回对象本身
  2. 自动释放池的创建方式

    ① 通过@autoreleasepool{}创建
    ② 通过NSAutoreleasePool类创建

2> 使用注意

  • 自动释放池的创建和释放遵循栈规则
  • 调用autorelease方法不会对引用计数器产生影响
  • autorelease方法延迟了对象的释放时间,占用内存较大的对象不要使用
  • 一个对象不能多次调用autorelease方法
  • 一个对象不能同时使用autorelease方法和release方法

3> 常见应用

  • 快速创建一个自动释放池内的对象

    ① 通常设计一个类方法,快速创建一个自动释放池内的对象
    ② 方法名通常以类名开头
    ③ 创建时要使用self调用alloc、init与autorelease方法,不要使用类名

四、ARC

1> 基本使用

  1. 强指针与弱指针

    ① 强指针
    1)通过__strong声明的指针
    2)所有的指针默认都是强指针
    ② 弱指针
    1)通过__weak声明的指针
    2)当弱指针指向的对象被释放,弱指针将被清空
  2. 判断准则

    只要没有强指针指向对象,对象就会被释放

2> @property的strong和weak参数

  • strong参数相当于retain参数
  • weak参数相当于assign参数

OC - 5.内存管理的更多相关文章

  1. 12.Object-C--浅谈OC的内存管理机制

    昨天学习了OC的内存管理机制,今天想总结一下,所以接下来我要在这里bibi一下:OC的内存管理. 首先我要说的是,内存管理的作用范围. 内存管理的作用范围: 任何继承了NSObject的对象,对其他基 ...

  2. 黑马程序员——OC的内存管理学习小结

    内存管理在Objective-C中的重要性就像指针在C语言中的重要程序一样. 虽然作为一门高级语言,但OC却没有内存回收机制.这就需要开发者来对动态内存进行管理.OC中内存管理的范围是:任何继承了NS ...

  3. OC:内存管理、dealloc方法、copy知识点

    属性的声明:使⽤@property声明属性
 例如:@property NSString *name: 相当于@interface中声明了两个⽅法(setter.getter): 属性的实现:使⽤@s ...

  4. OC的内存管理机制

    总的来说OC有三种内存管理机制,下面将分别对这三种机制做简要的概述. 1.手动引用计数(Mannul Reference Counting-MRC) mannul:用手的,手工的. 引用计数:reta ...

  5. OC基础 内存管理

    OC基础  内存管理 我们所了解的c语言内存管理,如下: (1)c语言的内存分配:char *p = (char*)malloc(100*sizeof(char)); (2)c语言的内存释放:free ...

  6. OC的内存管理(一)

    在OC中当一个APP使用的内存超过20M,则系统会向该APP发送 Memory Warning消息,收到此消息后,需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等,否则程序会 ...

  7. 黑马程序员——OC语言 内存管理

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)计数器 每个对象内部都保存了一个与之相关联的整数,称为引用计数器,当 ...

  8. OC的内存管理

    摘自:http://blog.csdn.net/hahahacff/article/details/39839571 OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有 ...

  9. oc语言--内存管理

    一.基本原理 1.什么是内存管理 1> 移动设备的内存及其有限,每个app所能占用的内存是有限制的 2> 当app所占用的内存较多时,系统就会发出内存警告,这是需要回收一些不需要的内存空间 ...

随机推荐

  1. JZ2440开发笔记(5)——通过按键点亮LED

    在JZ2440中,点亮LED就是给LED的控制位设置为输出,数据位设置为低电平,而通过按键点亮LED,就需要将按键对应的控制位设置为输出. 下面是JZ2440的3个LED电路图: 下面是JZ2440的 ...

  2. CodeForces - 445A - DZY Loves Chessboard解题报告

    对于这题本人刚开始的时候觉得应该用DFS来解决实现这个问题,但由于本人对于DFS并不是太熟,所以就放弃了这个想法: 但又想了想要按照这个要求实现问题则必须是黑白相间,然后把是字符是'B'或'W'改为' ...

  3. Java笔记(二十八)……IO流下 IO包中其他常用类以及编码表问题

    PrintWriter打印流 Writer的子类,既可以接收字符流,也可以接收字节流,还可以接收文件名或者文件对象,非常方便 同时,还可以设置自动刷新以及保持原有格式写入各种文本类型的print方法 ...

  4. iOS开发——View的透明属性hidden、alpha、opaque

    Hidden.Alpha.Opaque的区别 在iOS中,每个View都有Hidden.Alpha.Opaque三个关于透明的属性,官方文档介绍如下: 1. @property(nonatomic) ...

  5. Codeforces Round #226 (Div. 2)A. Bear and Raspberry

    /* 贪心的找到相邻两项差的最大值,再减去c,结果若是负数答案为0. */ 1 #include <stdio.h> #define maxn 105 int num[maxn]; int ...

  6. VC++从入门到精通视频教程网址

    视频教程网址:http://www.pconline.com.cn/pcedu/empolder/gj/vc/0607/820674.html

  7. (贪心5.1.1)POJ 1230 Pass-Muraille

    /* * POJ_1230.cpp * * Created on: 2013年10月9日 * Author: Administrator */ #include <iostream> #i ...

  8. H5离线缓存机制-manifest

    简介:Manifest 其实就是web应用的一种缓存机制,主要用于现在webapp应用中,它是浏览器自己的一种机制,随着移动互联网时代的到来,网络可靠性降低,如果我们已经将需要的文件缓存下下来,一旦网 ...

  9. Jquery JS 正确比较两个数字大小的方法

    if(2 > 10) { alert("不正确!"); } 此比较不会是想要的结果:它相当于2 >1,把10的第一位取出来比较. ——————————————————— ...

  10. 使用sessionStorage得一个坑

    1.首先sessionStorage.setItem("isMybill" false) 2.使用的时候 sessionStorage.getItem('isMybill')  / ...