iphone 内存管理的局部总括

   iphone 里采用Object c
开发,相对来说,只要遵守了apple的有些编程规则,比C++的内存管理来的容易些,然而也有不少亟待专注的地点,一旦出现内存相关的不当,调试也是个很头痛的题材。

1. 诸如出现 **EXC_BAD_ACCESS
 **错误,给你的错误提醒就以此,咋样根本没法了解何地错误了,其实依然有办法知情的,

做如下设置:

Project -> Edit active executable ->Argument 

加上如下多少个参数

NSDebugEnabled

NSZombieEnabled

MallocStackLogging 

MallocStackLoggingNoCompact

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

ACCESS 1 

  这么些时候,如若有如下一段代码:

 //重复释放一个变量 

  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出现问题了。 

ACCESS, 

  1. 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。

 

  1. init 和 Release 的问题。

    凡是对象通过Init的艺术生成的目的,都急需自己承受Release。

    凡不是透过Init的办法生成的对象,不需要负担Release.如[NSString
StringWithFormat]方法生成的目的就不需要自己Release,因而自己定义函数,重回一个类的时候,一定要安装为autoRelease 。这样调用的人就绝不操心是否需要自由对象了。

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

 

    

 

相关文章