iOS 内存管理基础知识

cc68 9年前

内存管理问题,首先要知道一个概念,引用计数。Objective-C 的内存管理基于引用计数(Reference Count)。如果要使用一个对象,并希望确保在使用期间对象不被释放,需要保证在使用过程中引用计数>0,在使用过后,把引用计数-1。当引用计数==0时,就会调用销毁方法了。

           那么我们非常有必要知道,哪些操作会使用引用技术+1,哪些会-1。OK,下面是一个列表:

        +1操作

        alloc - 创建对象是调用alloc,为对象分配内存,对象引用计数加一。、

        copy - 拷贝一个对象,返回新对象,引用计数加一。

        retain - 引用计数加一,获得对象的所有权。

        -1操作

        release - 引用计数减一,释放所有权。如果引用计数减到零,对象会被释放。

        autorelease - 在未来某个时机释放。

  

     autorelease是一个特别的方法,实际上是把release这件事交给了一个叫做自动释放池(autorelease pool)的东西,在系统觉得需要清理的时候,才会调用release方法。由于交由系统来处理,所以可能release的时刻并不是那么及时,所以在一些必要的时候,我们还是需要自己手动去release.

       此外还需要注意的一个地方,就是容器。NSArray,NSDictionary这些类,在添加对象的时候,会自动的把对象的引用计数+1,在自身销毁的时候,又会把这些对象的引用计数-1.同理UIView对自己的subview也是这个样子。

        内存管理,我们需要遵循一些基本原则:

        1.保证只有带alloc,copy,retain的函数才会让引用计数+1.

        2.在对象的dealloc函数中释放对象所拥有的实例变量。

        3.永远不要直接调用dealloc来释放对象,完全依赖引用计数来完成对象的释放。

        4.在很多类方法可以直接创建autorelease对象。

        5.在把一个参数传递出去的时候,因为要交由别人来释放,一般设置成autorelease对象。