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

 

  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掉。

 

    

 

相关文章