Objective-C内存管理

来源:互联网 发布:数组排序 编辑:程序博客网 时间:2024/05/07 15:29

内存管理

    思路:只把当前参与逻辑的对象留下。

    必要性:当应用程序所消耗的内存超过一定的量,iOS会给予2次内存警告,如果内存消耗依然不能减小并超过规定的内存使用范围,iOS系

  统会强行终止应用程序,造成闪退的现象。

    管理原则:配对原则(只要出现了new,alloc,retain,copy,就一定配对出现一个release,autorelease,保持局部内存管理平衡)


[对象 release];// rc - 1并返回self(对象自身)

[对象 alloc];// rc = 1并返回self(对象自身)

[对象 new];// rc = 1并返回self(对象自身)

[对象 retain];// rc + 1并返回self(对象自身)

[对象 copy];// rc + 1并返回self(对象自身)


MRR   Manual retain-release


创建对象

1.分配内存空间,存储对象

2.初始化成员变量

3.返回自身的指针地址(retainCount = 1)//对象在完成创建的同时,内部会自动创建一个引用计数器。这个计数器,是系统用来判断是否回

//收对象的唯一依据。当retainCount = 0时,系统回收对象(调用对象的dealloc方法)


手动管理内存的关键

1.野指针操作(闪退)

2.内存泄露(不再被使用的对象,一直在内存中没有被销毁)


解决方法:


1.避免野指针操作的方法:

如果确定当前作用域中的对象已经不会再被使用,通常会把不在使用的指针变量赋值为nil。


2.内存泄露可能的原因

(1)release次数不够

(2)提前将指针赋值为nil

(3)已销毁的对象,不能通过retain“复活”


set方法模板

if (内部属性 != 传入的对象)//判断是否使用同一对象多次赋值,防止内存泄露

{

[内部属性 release];//将内部属性之前所拥有的对象release,防止内存泄露

内部属性 = [传入的参数 retain];//内部属性拥有新传入的对象,将此对象的rc加1

}


  • (void)dealloc

{

[super dealloc];//在对象自身被销毁前,一定先调用[super dealloc]释放父类中的相关对象

[内部属性 release];//释放本类属性相关的对象,防止内存泄露

//释放对象所有相关的对象

}


自动释放池

对象存入到自动释放池中,此池子被销毁的时候会对池中所有的兑现改进型一次release操作。//可以认为池子是个容器类,比如

    //NSMutableArray。


autorelease方法的作用

将对象放入到自动释放池中,然后返回self。


关键:

1.无论对象是否在自动释放池内部创建,只要在其内部对对象发送autorelease消息,就会将对象放入自动释放池中。


2.如果多次将统一对象放入自动释放池,自动释放池就会多次对此对象发送release消息,由此会导致野指针操作的问题。


3.若在快速获取一个对象的类方法中创建一个新对象,一定初始化为nil,防止野指针操作,并使用autorelease,防止内存泄露(系统提供的快速获取对象的方法就是使用autorelease)。


ARC机制


系统释放对象的原则:只要有强指针指向一个对象,那么系统就不会回收该对象。(弱指针不影响对象被回收)

与JAVA垃圾回收的区别:只要没有强指针指向对象,系统就会立即回收该对象。


默认情况下,所有指针都是strong指针

定义弱指针:类型前使用__weak修饰


ARC下不允许使用的关键字:

dealloc,retain,release,autorelease


ARC    MRR

strong <———>      retain

weak <———>      assign     

//weak指针所指向的对象被回收后,自动赋值为nil


ARC与MRR共存


设置位置:Build Phases 

                  —>  Compile Source  

                  —>  选中需要设置的.m文件


设置项目中MRR的.m文件的编译参数为   -fno-objc-arc

指定此文件是非arc机制。


其他


僵尸对象:被系统回收的对象。

产生原因:默认情况下,XCode为了提高编码效率,不会实时检查僵尸对象。


开启XCode实时监测僵尸对象的功能:

Edit scheme

—>Diagnostics

—>objective-c

—>勾选enable Zombie objects选项


dealloc方法:当一个对象的引用计数等于零的时候,系统会自动调用这个对象的dealloc方法,释放此对象所拥有的所有对象,并收回此对象所占据的内存空间。


类的循环引用问题(双向引用)

解决方法:

1.头文件中使用@class

2.实现文件中再使用import命令导入头文件

3.将依赖方的strong指针修改为weak


0 0