xcode memory leaks instruments

当你遇到了一个EXC_BAD_ACCESS错误,我通常会给开发者几个建议:

  1.在可执行选项中设置NSZombieEnabled参数,这有时会帮缩小问题的范围;

  2.运行apple的内存检测工具, Leaks ,以便寻找内存问题;

  3设定一个断点,单步运行代码,直到你找到引起崩溃的位置;

  4.注释代码,直到不崩溃为止,然后再从后往前查找错误;

Xcode 的Analyze 分析内存泄露不能把所有的内存泄露查出来,有的内存泄露是在运行时,用户操作时才产生的。那就需要用到Instruments了。

关于:tableView:didSelectRowAtIndexPath ,分析下它的内存过程:

  1. sushiString变量通过autorelease创建,它的引用计数是1.   

  2. 这行代码使得引用计数增加到2, _lastSushiSelected = [sushiString retain];

  3. 这个方法结束时,sushiString的autorelease生效了,这个变量的引用计数减少为1

  4. 当再次执行tableView:didSelectRowAtIndexPath这个方法时,_lastSushiSelected被赋值了新指针,老的_lastSushiSelected的引用计数还是1,没有被释放,产生了内存泄露。

怎么解决呢?

_lastSushiSelected = [sushiString retain];之前把原来的release就ok了:

[cpp] view plaincopy

  1. [_lastSushiSelected release];  

  2.     _lastSushiSelected = [sushiString retain];  

关于:tableView:cellForRowAtIndexPath

这个比较明显,sushiString被alloc和init之后就没有释放,可以用stringWithFormat来调用autorelease,代码如下:

[cpp] view plaincopy

  1. NSString *sushiString = [NSString stringWithFormat:@"%d: %@", indexPath.r


你可能感兴趣的:(xcode memory leaks instruments)