zoukankan      html  css  js  c++  java
  • iphone 内存管理的一些总结

       iphone 里采用Object c 开发,相对来说,只要遵循了apple的一些编程规则,比C++的内存管理来的容易些,但是也有很多需要注意的地方,一旦出现内存相关的错误,调试也是个很头疼的问题。

    1. 比如出现 EXC_BAD_ACCESS  错误,给你的错误提示就这个,如何根本没法知道哪里错误了,其实还是有方法知道的,

    做如下设置:

    Project -> Edit active executable ->Argument 

    添加如下四个参数

    NSDebugEnabled

    NSZombieEnabled

    MallocStackLogging 

    MallocStackLoggingNoCompact

    并都设置为YES。具体如下图:

     

      这个时候,如果有如下一段代码:

     //重复释放一个变量 

      NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

      NSData* data = [NSData dataWithBytes:"asklaskdxjgr" length:12];

      [data release];

      [pool release];

    再Debug窗口会有如下的提示

       2003-03-18 13:01:38.644 autoreleasebug[3939*** *** Selector 'release'

      sent to dealloced instance 0xa4e10 of class NSConcreteData.

    虽然也能大致判断是哪种类型的变量重复释放了,但信息还不够多,当项目大,源码比较多的时候,也不太方便定位,

    在console窗口运行如下命令可以得到更多信息:shell malloc_history <pid> <address>"

     输入命令:shell malloc_history 3939 0xa4e10

     就会出现更多的信息:

      [dave@host193 Frameworks]$ malloc_history 3939 0xa4e10

      Call [2] [arg=32]: thread_a0000dec |0x1000 | start | _start | main |

      +[NSData dataWithBytes:length:] | NSAllocateObject | object_getIndexedIvars |

      malloc_zone_calloc  

    这个时候就知道具体哪个函数出先问题了,从这里可以看到main里NSData出现问题了。 

    2. NSArray等集合类的实用问题。

          如下面的代码    

            ReleaseTest* rt = [[alloc] init];

    NSMutableArray *array = [[NSMutableArray alloc] init] ;

    [array addObject: rt];

    ReleaseTest *rt2 = [array objectAtIndex:0];

          [rt2 release];   

    [array release];

    [rt release]; 

         就会导致重复释放内存问题,因为rt2,获取的是一个对象的指针,如果已经释放了的话,rt在释放的话,就重复了,为了遵循谁Init谁Release的原则,rt2就不应该Release。

    3. init 和 Release 的问题。

        凡是对象通过Init的方法生成的对象,都需要自己负责Release。

        凡不是通过Init的方法生成的对象,不需要负责Release.如[NSString StringWithFormat]方法生成的对象就不需要自己Release,因此自己定义函数,返回一个类的时候,一定要设置为autoRelease 。这样调用的人就不用操心是否需要释放对象了。

     4. AutoReleasePool里最好不要将AutoRelease对象赋值给其它对象,否则离开这个作用域后,对象将会Release掉。

        

  • 相关阅读:
    Vim插件列表
    比nerdtree更好的文件浏览器:vimfiler
    在不同的窗口之间跳转
    unite
    ARMv7 .n和.w指令宽度指示符后缀
    Mybatis之分表设计与分表插入
    thymeleaf之菜单树
    管理后台菜单查询
    Linux下Tomcat重新启动
    网页缓存清除
  • 原文地址:https://www.cnblogs.com/likwo/p/1950664.html
Copyright © 2011-2022 走看看