Objective-C内存管理

引用计数

申请了一块内存空间,如果将指针置空了而没有释放对象,则会内存泄露,如果提前释放了对象,又很可能会有野指针的出现。并且如果有很多类都引用了这个对象,甚至的不知道我应该什么时候释放它。因此,Object-C引入了引用计数这种管理内存的方法,任何引用这个对象的地方,都应该让这个对象的引用计数加1。同样,任何不再需要这个对象的地方,也应该使它的引用计数减1,如此一来,对象内存便被统一的管理了起来。
  每个对象内部都有一个retainCount的引用计数,对象刚被创建时,引用计数为1;可以手动调用retain方法使引用计数加1;同样也可以手动调用release方法使引用计数减1。调用release方法时,如果retainCount值减到0,系统将自动调用对象的dealloc方法,开发人员可以在dealloc中释放或清理资源。

MRC手动管理内存(人工引用计数Mannul Reference Counting)

MRC模式下,所有的对象都需要手动的添加retain、release代码来管理内存。使用MRC,需要遵守谁创建,谁回收的原则。也就是谁alloc,谁release;谁retain,谁release。当引用计数为0的时候,必须回收,引用计数不为0,不能回收,如果引用计数为0,但是没有回收,会造成内存泄露。如果引用计数为0,继续释放,会造成野指针。为了避免出现野指针,我们在释放的时候,会先让指针=nil。

ARC自动管理内存(自动引用计数Automatic Reference Counting)。

ARC是IOS5推出的新功能,通过ARC,可以自动的管理内存。在ARC模式下,只要没有强指针(强引用)指向对象,对象就会被释放。在ARC模式下,不允许使用retain、release、retainCount等方法。并且,如果使用dealloc方法时,不允许调用[super dealloc]方法。ARC模式下的property变量修饰词为strong、weak,相当于MRC模式下的retain、assign。strong :代替retain,缺省关键词,代表强引用。weak:代替assign,声明了一个可以自动设置nil的弱引用,但是比assign多一个功能,指针指向的地址被释放之后,指针本身也会自动被释放。

混编

在ARC的项目中,对MRC的文件可以添加编译选项-fno-objc-arc的标识;在MRC的项目中,对ARC的文件可以添加编译选项 -fobjc-arc的标识。

内存管理的黄金法则

引用计数内存管理的机制是对象的计数,每个对象至少会有一个引用者,如果没有了引用者,对象会被释放。
黄金法则:
1、当你使用alloc,new,copy,mutableCopy创建对象时,你才需要管理他们。
2、你可以使用retain给一个对象增加引用计数。
3、当你不再需要一个对象时,你必须调用release减少其引用计数。
4、你不能释放不属于你的对象的所有权。

autorelease

对象接收到autorelease消息时,它会被添加到了当前的自动释放池中,当自动释放池被销毁时,会給池里所有的对象发送release消息。
  这里就引出了自动释放池这个概念,什么是自动释放池呢? 顾名思义,就是一个池,这个池可以容纳对象,而且可以自动释放,这就大大增加了我们处理对象的灵活性。
  app使用过程中,会定期自动生成和销毁自动释放池,一般是在程序事件处理之前创建,当然我们也可以自行创建自动释放池,来达到我们一些特定的目的。
  自动释放池的销毁时间是确定的,一般是在程序事件处理之后释放,或者由我们自己手动释放。

修饰符

readwrite:表明这个属性是可读可写的,系统为我们创建这个属性的setter和getter方法。
readonly:表明这个属性只能读不能写,系统只为我们创建一个getter方法,不会创建setter方法
系统默认是readwrite
assign:赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;
retain:持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;
copy:赋值特性,setter方法将传入对象复制一份;需要完全一份新的变量时。
strong:强引用,持有所指向对象的所有权,无修饰符情况下的默认值。如需强制释放,可置nil。
weak:弱引用,不持有所指向对象的所有权,引用指向的对象内存被回收之后,引用本身会置nil,避免野指针。

你可能感兴趣的:(Objective-C内存管理)