zoukankan      html  css  js  c++  java
  • OC自动内存释放总结

    1. autorelease方法不会改变对象的引用计数器,只是将这个对象放到自动释放池中;
    2. 自动释放池实质是当自动释放池销毁后调用对象的release方法,不一定就能销毁对象(例如如果一个对象的引用计数器>1则此时就无法销毁);
    3. 由于自动释放池最后统一销毁对象,因此如果一个操作比较占用内存(对象比较多或者对象占用资源比较多),最好不要放到自动释放池或者考虑放到多个自动释放池;
    4. ObjC中类库中的静态方法一般都不需要手动释放,内部已经调用了autorelease方法;  
    5. 是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄露。在每个OC对象内部,都专门有4个字节的存储空间来存储引用计数器
    6. ////
    7. - (void)setCar :(Car *)car {

      //1.先判断是不是新传进来的的对象

    8. if(_car!=car){
      1.  //对就对象做一次release
      2. [_car release];//若没有旧对象则没有影响
      3. //对新对象做一次retain
      4. _car = [car retain];
      5.   }
    9. }//////////////

      dealloc方法的代码规范

    (1)一定要[super dealloc],而且要放到最后

    (2)对self(当前)所拥有的的其他对象做一次release操作

    dealloc 也是用来释放资源的 ,跟viewDidUnload的关系:

       当发出内存警告调用viewDidUnload方法时,只是释放了view,并没有释放UIViewController。所以并不会调用dealloc方法。即viewDidUnload和dealloc方法并没有任何关系,dealloc方法只会在UIViewController不被释放的时候调用。

    内存管理相关参数

    Retain:对对象release旧值,retain新值(适用于OC对象类型)

    Assign:直接赋值(默认,适用于非oc对象类型)

    Copy:release旧值,copy新值

     
     
     
  • 相关阅读:
    C# WCF的POST请求包含Stream及多个参数
    C# Fakes
    C# 计算文件的MD5
    C# 获取计算机的硬件、操作系统信息
    整数拆分
    整数拆分问题的四种解法【转载】
    python爬虫
    【转载】Scrapy安装及demo测试笔记
    Python野生库
    【转载】python3安装scrapy之windows32位爬坑
  • 原文地址:https://www.cnblogs.com/crybee/p/4934275.html
Copyright © 2011-2022 走看看