Object_C内存管理

jackyan 发布于 2018年01月03日
无人欣赏。

简介
程序内存管理是在程序运行期间分配,使用和释放内存的过程。不好的内存管理,程序就会出现很多内存泄露,从而影响程序的效率和质量,甚至导致程序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。

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

暂无回复
登录 或者 注册
相关帖子