Objective-c中的内存管理的黄金法则,OC中最重要的部分

时间:2022-01-18 00:05:39

现如今还是菜菜,如若有错误的地方还望指正!

如若转载,请注明源地址:http://blog.csdn.net/shinilaobababa/article/details/8453434

首先还是来一句OC中的内存管理的黄金法则比较好

      如果对一个对象使用了alloc、[Mutable]copy,retain,那么你必须使用相应的realease或者autorelease。(黄金法则就应该有金黄色的背景来衬托)

Objective-C的内存管理机制是比较灵活的,即可以完全的手动进行内存的管理,也可以用AutoreleasePool让它升级为半自动化的内存管理模式

1、cocoa中的内存管理机制——引用计数

      引用计数(reference counting)又称为保留计数(retain counting),引用计数的数值表示有几个其它对象在使用它。

每一个对象都拥有一个引用计数

        当对象被创建的时候,引用计数的值为1

        当发送retain消息的时候,该对象的引用计数加1,该对象的引用计数为2

        当这个对象发送release消息的时候,该对象的引用计数减1

        当一个对象的引用计数为0时,系统自动调用dealloc方法,销毁该对象。

Dog *dog = [[Dog alloc]init];//此时引用计数为1
NSLog(@"  %d",[dog retainCount]);

[dog retain];//引用计数变成2

[dog release];//引用计数变成1
[dog release];//引用计数变成0,系统会自动调用dealloc方法,销毁对象,回收内存

引用计数是实例对象的内存回收唯一参考

引用计数(retainCount)是Objective-C管理对象引用的唯一依据。调用实例的release方法后,此属性减一,减到为零时对象的dealloc方法被自动调用,进行内存回收操作,也就是说我们永不该手动调用对象的dealloc方法。

关于dealloc方法

       它的作用是,当对象的引用计数为0时,系统会自动调用dealloc方法,回收内存,它的一般写法为:

-(void)dealloc                                                   -(void)dealloc

{                                                                                {

       [super  dealloc];                                                     [person release];

}                                                                                       [super dealloc];

                                                                                  }

在这里为什么要调用父类的dealloc方法呢

           子类的某些实例是继承自父类的,因此,我们需要调用父类的dealloc方法,来释放父类拥有的这些对象。

一般来说调用的顺序是,当子类的对象释放完时,然后再释放父类的所拥有的实例,这一点与调用初始化方法,正好相反。

2、对象所有权

      当一个所有者(可以是任何一个OC对象)做了以下某个动作的时候,它就拥有了对一个对象的所有权。

      (1)如果创建或者复制某个对象时,则拥有了该对象的所有权,即包含下列关键词时:
               alloc,allocWithZone:,copy,copyWithZone:,mutableCopy,mutableCopyWithZone:

      (2)如果没有创建或复制对象,而是保留引用,同样拥有该对象的使用权

              retain

      (3)当拥有了某个对象的所有权,在不需要某一个对象时,需要释放他们,用

             release,autoRelease

3、自动释放池的相关用法

        (1)cocoa中的自动释放池(Autorelease pool),是能够自动释放赤忠的对象的。NSObject类提供了一个autorelease消息,当我们想一个对象发送autorelease消息的时候,这个对象就会随着释放池的销毁而释放。如果要向使用使用自动释放池释放对象,我们首先要有一个入池操作:

//创建自动释放池
@autoreleasepool {
        
    //入池对象5.0之后的写法
        
    }

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

   //入池对象5.0之前写法

[pool release];

自动释放池是以栈的形式实现的,当某个对象调用了autorelease方法时,该对象会被加入自动释放池的栈顶。对于发送了autorelease消息的对象,当自动释放池销毁时,自动释放池会对这些对象发送一条release消息,来释放他们。

        (2)向自动释放池发送release及drain消息的区别

           当我们向自动释放池pool发送release消息时,它会向池中的每一个发送了autorelease消息的对象发送一条release消息,并且自身也会销毁。当向它发送drain消息时,只会释放里面吧的对象,而不会销毁自己。

4、关于ARC(Auto reference counting)自动引用计数           

      当你在编译程序的时候提供自动管理内存的功能,它会自动加入内存的控制代码,控制对象的生命周期,大大简化了内存管理的步骤,ARC管理内容的原理就是,编译器会在适当的地方自动插入retain、release和autorelease消息,但是注意版本,是在ios4及以上(不是很确定)。要使用此方法,可以在Xcode中创建项目时勾选,如图

如图:

在新建MAC的命令行程序时:

Objective-c中的内存管理的黄金法则,OC中最重要的部分

Objective-c中的内存管理的黄金法则,OC中最重要的部分

当在创建IOS工程时:

Objective-c中的内存管理的黄金法则,OC中最重要的部分

5、垃圾回收机制

       类似与java中的垃圾回收机制,Objective-c在2.0以后也提供了垃圾回收机制,但是在IOS 中并不支持。但是我们要明白的是垃圾回收机制并不是ARC,ARC也是需要管理内存的,只不过是隐式的管理内存