NSAutoreleasePool EXC_BAD_ACCESS和关于Objective-C中的内存管理的问题

Can*_*ner 1 iphone memory-management objective-c

我很难理解NSAutoReleasePool的工作原理.

1)NSAutoReleasePool是单独跟踪每个分配还是依赖于变量?换句话说,这会泄漏内存还是释放?:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
 NSArray* myObj = [NSObject alloc];  
 myObj = [NSObject alloc];  
 [pool release];
Run Code Online (Sandbox Code Playgroud)

2)为什么以下代码有效:

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

 NSArray* myObj = [NSObject alloc];

 for(int i = 0; i < 100; i++) {
  [myObj release];
  myObj = [NSObject alloc];
 }

 [pool1 release];
Run Code Online (Sandbox Code Playgroud)

但以下给出了EXC_BAD_ACCESS [pool1 release]:

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

 NSArray* myObj = [NSObject alloc];

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

 for(int i = 0; i < 100; i++) {
  [myObj release];
  myObj = [NSObject alloc];
 }

 [pool2 release];
 [pool1 release];
Run Code Online (Sandbox Code Playgroud)

3)如何使上面的代码工作(具有2个池的代码)?

Ste*_*ton 5

自动释放池仅适用于您自动释放的对象.代码中的所有对象都不会自动释放,因此不会受到您创建的池的影响.

因此,答案是:

  1. 它泄漏了两个对象(因为它们都没有被释放或自动释放)
  2. 它没有.它泄漏了最后分配的对象
  3. 文档说你可以嵌套它们.如果我假设[NSObject alloc]你真正意味着[[[NSObject alloc] init] autorelease]你的第二个代码示例将失败,因为你第一次发布myObj它将是一个在外面声明的对象pool2.这意味着当您release pool1尝试释放已释放的对象时.使其工作的方法是不释放(或自动释放)对象多于保留或分配的对象.