zoukankan      html  css  js  c++  java
  • 最近做内存泄露检查的InstrumentsLeaks使用心得

    最近做内存泄露检查的Instruments-Leaks使用心得

    Leak检查的建议
     
    话说手上一个工程差不多结束了,到了优化和测试的阶段,开始第一次用Instruments,我很担心的内存泄露问题果然是存在的,而且还不少(虽然内存占用都很少)
     
    使用上几个建议:
    1.一定要打开右边的窗口看程序调用栈
    2.显示的程序调用关系不是真正泄露的地方,而是该泄露对象产生的地方,或者最后一次访问的地方,查一下相关的应用又在哪里变化就行
    3.实在不行的话左边窗口还有个感叹号,有对象release和retain的历史记录,不过不一定对应的到代码
    4.现在还有些UIKit的泄露对象,我也不知道为什么,以后再看
     
    关于代码几点建议:
    1.检查自己代码中所有的 alloc,copy,multicopy,retain,release,autorelease,有占用就要有释放,必须一一对应的。
    2.我曾经犯过的一个错误:两个对象相互应用的时候都用了retain,导致不能释放,比如A有个属性是B类型,@property(nonatomic,retain) B *childB;,然后B里面又有个a  @property(nonatomic,retian) A *parentA。这就会造成不能释放,正确做法是考虑一下两者的层级关系,子对象就别retain父对象了。改为 @property(nontomic,assign) A *parentA; ,另外我一般要用父对象都用delegate,这是正规做法吧
    3.一个对象如果设置了retain 的property属性,就必须调用 self.prop = xxx 来设置,不然老对象不会自动释放。比如:
    in XX.h
    B *_childB;
    @property(nonatomic,retain) B *childB;
     
    in XX.m
    @synthesized childB = _childB;
     
    然后在方法里面,有时候用 self.childB = xxxx; 有时候用 _childB = xxxx; 这样,上一个retain的对象就泄露了,正确做法就是用self.childB = xxxx  或者  [_childB release], _childB = [xxxx retain];
    最后在dealloc释放:self.childB = xxxx;
     
    看过书的应该知道retain property 的set方法有几步,相当于:
    -setChildB:(B*)b
    {
      [b retain];
      [_childB release];
      _childB = [b retain];
      [b release];
    }
    第一个retain是防万一b==_childB
     
    后续看有没有需要截图或细化,有说的不对的地方请大家指正,谢谢。

  • 相关阅读:
    ubuntu搭建php开发环境记录
    zz-什么是网关,路由,dns,通俗讲解
    如何设置root用户密码
    zz三台centos7虚拟机设置相互免密码登录
    go之闭包及其应用
    网络是怎样连接的
    进程间通信方式探索
    现代操作系统——操作系统概念
    现代操作系统——硬件_IO设备——设备控制器和设备本身
    simotion byte/word ASCII码转换为字符、字符串
  • 原文地址:https://www.cnblogs.com/lsck/p/2511527.html
Copyright © 2011-2022 走看看