iOS开发 - 内存管理

01、简介

内存是与CPU沟通的桥梁,计算机程序运行在内存,因此对内存的使用进行优化极为重要

02、内存管理说明

2.1 主要分类

内存管理主要分为自动内存管理和手动内存管理两大类

2.2 自动内存管理

2.2.1 由系统自动管理内存的方式,叫做自动内存管理

2.2.2 一些编程语言将自动内存管理称为垃圾回收,如Java

2.3 手动内存管理

由开发者写代码管理内存的方式,叫做手动内存管理

03、开发中内存常见的问题

内存泄露:就是程序中对象使用完毕后,并没有释放内存,就会造成内存泄露

内存溢出:内存不够用的情况叫做内存溢出

04、iOS内存管理

4.1 范围

任何直接或间接继承自NSObject的对象,基础数据类型不需要管理

4.2 引用计数

4.2.1 原理

1> 每个对象内部有一个与内存相关的数,叫做引用计数

2> 引用计数为0,对象被销毁,它占用的内存被回收,程序结束内存也会被回收

3> 引用计数占4个字节

4.2.2 操作

1> retain,引用计数+1

2> release,引用计数-1

3> retainCount,获得对象当前的引用计数

4.2.3 原则

1> 谁创建、谁释放

使用alloc、new、copy、mutableCopy创建的对象,需要release或autorelease

一般情况下,alloc、new、copy之外的方法创建的对象使用autorelease

2> 谁retain,谁release

只要调用retain,必须调用release,无论该对象怎样创建的

3> alloc、new、copy创建的对象引用计数默认为1

05、dealloc方法

1.不能人为调用,只能由系统调用

2.重写dealloc方法时,需要释放相关资源,即对self所拥有的其他资源release

3.对象的引用计数为0时,系统自动调用dealloc方法

4.重写dealloc方法时,[super dealloc];必不可少,并且要放到最后

5.只在MRC下使用

06、@property属性的内存管理关键代码

// 不考虑多线程的情况
@property IdentityCard *card;

- (void)setCard:(IdentityCard *)card
{
    if (card != _card)
    {
        [_card release];
        _card = [card retain];
    }
}

- (void)dealloc
{
    [_card release];
    [super dealloc];
}

07、@property属性的内存管理的处理

7.1 内存管理相关属性,即setter

assign:直接赋值,适用于非OC对象类型

retain:release旧值,retain新值,适用于OC对象

copy:release旧值,copy新值,适用于OC对象

7.2 读写属性,即是否生成setter、getter

readwrite:同时生成setter、getter的声明和实现

readonly:只生成getter声明和实现

7.3 线程管理

atomic:多线程操作,性能较低

nonatomic:非多线程操作,性能较高

7.4 方法别名

setter:setter起别名,必须使用:

getter:getter起别名,多用于BOOL类型

08、处理循环引用

1.两个对象相互引用的时候,一端使用assign,一端使用retain

2.使用assign修饰的其中一个对象不能使用release,因为assign代表基础数据类型

09、autorelease pool(自动释放池

9.1 简介

1.自动释放池是延迟释放对象的一种方式

2.自动释放池销毁时,池内的对象的引用计数-1,即release,对象不一定被回收

9.2 优缺点

优点:不关心对象的释放时间,不用关心什么时候release

缺点:不能精确的控制对象释放的时间 

10、iOS的自动内存管理

10.1 简介

iOS自动内存管理,即ARC,Automatic Reference  Counting,自动引用计数

ARC的本质是MRC,由编译器插入retain、release、autorelease、dealloc等方法

10.2 指针类型

强指针

强指针指向的对象在程序结束之前不会被回收,是默认的类型

弱指针

弱指针指向的对象如果被回收,弱指针会自动置为nil

10.3 判断准则

只要没有强指针指向对象,该对象就会被回收

10.4 注意事项

1.不允许使用release、retain方法

2.能够调用dealloc方法,但是不允许调用[super dealloc];

11、ARC下的@property

1、strong:相当于MRC下的retain,适用于OC对象类型

2、weak:相当于MRC下的assign,适用于OC的对象类型

3、assign:使用于OC的基础数据类型

4、之前的retain改用strong

12、MRC与ARC转换

整个项目MRC向ARC转换

Edit -> Refactor -> Convert Objective-C ARC... -> Check -> Next -> Save -> Enable

某个文件ARC向MRC转换

选中蓝色的项目 -> 选中Build Phases -> 点开Compile Sources -> 找到需要转换的文件双击输入-fno-objc-arc

某个文件MRC向ARC转换

选中蓝色的项目 -> 选中Build Phases -> 点开Compile Sources -> 找到需要转换的文件双击输入-f-objc-arc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值