Object_C内存管理

来源:互联网 发布:中国空运交通运输网络 编辑:程序博客网 时间:2024/06/05 17:13

简介     

      程序内存管理是在程序运行期间分配,使用和释放内存的过程。不好的内存管理,程序就会出现很多内存泄露,从而影响程序的效率和质量,甚至导致程序crash。所以深入学习和理解内存管理机制,对每个程序员(至少mac/ios 程序员)来说都很重要。


      Object-C的内存管理采用retain-release,autorelease机制。每个object都有一个计数器(ref count),当retain一个object时,该object的计数器就会自动加1,表示有地方在使用该object。当release一个object时,该object的计数器自动减1。当计数器为0时,该object会从内存中释放掉。


      [object retain] ---// count +1;

        [object release] ---// count  -1(注意:不是真正的释放,当ref count==0时,才会释放掉);


703347a3habf370119d75&690.png

使用内存管理


     1. 在存取方法中使用

            

         //------------------------

             - (NSString *)name

            {

                 return name;

            }  


             - (void)setName:(NSString*)aName

            {

                 [name release];   //release old

                 name = [aName retain]; //assign new

            }

         //-----------------------

         

         - (void)dealloc

         {

                 [name release];

                 [super  dealloc];

         }

        现在大多使用@property (nonatomic, retain)NSString *name;这个等价于上面的两个方法。


       2. 避免正在使用的object被dealloc


              a.从集合类(NSArray)中移除一个对象


                      objectA = [array objectAtIndex:i];

                      [array removeObjectAtIndex:i];

                      //objectA 现在不可用。


              -----> 从NSArray中移除一个对象,会发送一个release消息给该对象[objectA release](而不是autorelease)。

              b.当一个parent object被释放


                      objectA = [parent child];

                      [parent release]; // 或者 self.parent = nil;

                      //objectA 现在不可用。


              -----> [parent release] 会调用parent的dealloc方法,在parent的dealloc方法中 child会被release。所以[parent release]后       objectA也会被release,变为不可用。


              为了保护objectA,可以reain一次该objectA:

            

               objectA = [[array objectAtIndex:i] retain];

                [array removeObjectAtIndex:i];

                //objectA 可用


               [objectA release];

 

        3.自动释放(autorelease)


           当autorelease一个object时,该object会被放入自动释放池(NSAutoreleasePool)中。NSAutoreleasePool会帮你release。


            三种情况可能会用到NSAutoreleasePool:

            

            a.当你的程序不是基于UI framework,例如 command-line tool。

           

            b.当你写一个loop,里面生成很多临时的object时,可能需要create 一个自动释放池。


            c.当开启另外的线程时,需要一个自动释放池来帮助减少内存的占用。



         4.垃圾回收(garbage collection system

            目前很少用,后续可能会使用该机制。--->系统帮我们来管理,不用手动的release。



另外:内存管理可能比较复杂,这里只做个大概的介绍,希望大家多多研究理解,让程序更加的健壮


0 0