oc内存管理总结

2017-09-05  本文已影响17人  当优秀成为习惯
(—)为什么要进行内存管理

由于移动设备的内存有限,每个app所占的内存是及其有限的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等,因此我们需要管理内存。

不过也不是所有的对象都需要我们回收,凡是继承自NSObject的OC对象才需要我们管理,因为他们是存放在堆区中。至于一些基本的数据类型比如(整型,浮点型,枚举,结构图,布尔)还有一些局部变量是存放在栈空间中的,当代码块结束的时候,他们也就自动回收了!

(二)如何管理内存

在Ios5之前,都是需要手动管理内存的也就是MRC,原理很简单,通过自动引用计数控制,当创建一个对象或者想拥有一个对象,那么该对象就会发送retain(引用计数+1)消息,当不想拥有这个对象,该对象就会发送release(引用计数-1)消息,直到当一个对象的引用计数为0的时候,就会调用对象的dealloc方法,这时候系统就知道该对象要被回收!

不过苹果爸爸为了减轻开发者的负担,在Ios5之后,给广大Ios开发者传来了好消息,推出了ARC(Automatic Reference Counting),全称为自动引用计数,也就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。

(三)内存管理代码规范

基本数据类型:直接赋值

- (void)setHeight:(CGFloat)height{
    _height = height;
}

OC对象类型:直接赋值

- (void)setBook:(Book *)book{
    if (_book!=book) {//先判断是不是新传进来的对象
        [_book release];//对旧对象做一次release
        _book = [book retain];//对新对象做一次retain
    }
}
- (void)dealloc{// 临终遗言

    NSLog(@"人被释放");
    [_book release];// 对拥有的对象做一次release
    [super dealloc];//MRC一定要调用
}
(四) @property的参数

(1)内存管理相关参数

(2)是否要生成set方法(若为只读属性,则不生成)

(3)多线程管理(苹果在一定程度上屏蔽了多线程操作)

(4)Set和get方法的名称

(五) 内存管理中的循环引用问题以及解决

案例:每个人有一张身份证,每张身份证对应一个人,不能使用#import的方式相互包含,这就形成了循环引用。
新的关键字:@class 类名;——解决循环引用问题,提高性能
@class仅仅告诉编译器,在进行编译的时候把后面的名字作为一个类来处理。
@class的作用

开发中引用一个类的规范

两端循环引用的解决方法

一端使用retain,一端使用assign(使用assign的在dealloc方法中也不用再release

(六)ARC内存管理原理
上一篇下一篇

猜你喜欢

热点阅读