oc -7 内存管理 相关参数 循环引用

来源:互联网 发布:景行知返免费阅读 编辑:程序博客网 时间:2024/06/05 19:07

  • 管理范围:任何继承了
    NSObject的对象,对其他基本数据类型(intcharfloatdoublestructenum等)无效
  • 计数器为4个字节.

    1.          引用计数器的操作

    格式:

    • 给对象发送一条retain消息,可以使引用计数器值+1retain方法返回对象本身)
    • 给对象发送一条release消息,可以使引用计数器值-1
    • 可以给对象发送retainCount消息获得当前的引用计数器值


    2.    对象的销毁 dealloc
    • 当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收
    • 当一个对象被销毁时,系统会自动向对象发送一条dealloc消息
    • 一般会重写dealloc方法,在这里释放相关资源,dealloc就像对象的遗言
    • 一旦重写了dealloc方法,就必须调用[super dealloc],并且放在最后面调用
    • 不要直接调用dealloc方法一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致程序崩溃(野指针错误)
    • 格式如下

  • 3.      开启僵尸对象监控

    默认情况下,Xcode是不会管僵尸对象的,使用一块被释放的内存也不会报错。为了方便调试,应该开启僵尸对象监控




  • 4、      内存管理原则

    1.          谁创建,谁release

    • 如果你通过allocnew[mutable]copy来创建一个对象,那么你必须调用releaseautorelease
    • 换句话说,不是你创建的,就不用你去[auto]release

     

    2.          retain,谁release

    • 只要你调用了retain,无论这个对象是如何生成的,你都要调用release
    格式如下: 人拥有书(调用set方法)的时候用  [bool retain],人死了时候(调用dealloc方法)用[_book release].
    严谨的set方法:如下

  • 当人不在(调用dealloc)的时候,release   book.

  • 3.          总结

    • 有始有终,有加就有减
    • 曾经让对象的计数器+1,就必须在最后让对象计数器-1

    相关参数


  • 循环引用: 你引用我,我引用你.


  • 1.          循环retain

    • 比如A对象retainB对象,B对象retainA对象
    • 这样会导致A对象和B对象永远无法释放

    2.          解决方案

    • 当两端互相引用时,应该一端用retain、一端用assign




    • @class#import的区别
    • #import方式会包含被引用类的所有信息,包括被引用类的变量和方法;@class方式只是告诉编译器在A.h文件中 B *b 只是类的声明,具体这个类里有什么信息,这里不需要知道,等实现文件中真正要用到时,才会真正去查看B类中信息
    • 如果有上百个头文件都#import了同一个文件,或者这些文件依次被#improt,那么一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍,这样的效率也是可想而知的,而相对来讲,使用@class方式就不会出现这种问题了
    • .m实现文件中,如果需要引用到被引用类的实体变量或者方法时,还需要使用#import方式引入被引用类



    ARC

    weak的使用场合
    循环引用时候  : 你引用我,我引用你.
    • 一端用strong、一端用weak


    查看系统是不是默认ARC :搜索框输入auto



0 0
原创粉丝点击