【问题标题】:NSMutableArray release causes crashNSMutableArray 发布导致崩溃
【发布时间】:2013-02-12 06:16:53
【问题描述】:

我正在使用 XCode 开发 iPhone 应用程序。我是这个平台的新手,在某个特定问题上需要一些帮助...

我有一个方法可以处理一些数据并返回两个整数值作为包裹在 NSMutableArray 中的 NSNumber。

方法如下:

-(NSMutableArray *)processPoints:(int) x:(int) y
 {
 NSMutableArray *mutArray = [[NSMutableArray alloc] initWithCapacity:3];
 int x9,y9;

 // ...do some processing...

 NSNumber* xNum = [NSNumber numberWithInt:x9];
 NSNumber* yNum = [NSNumber numberWithInt:y9];

 [mutArray addObject:xNum];
 [mutArray addObject:yNum];

  return [mutArray autorelease];
 }

我从另一个方法调用上述方法,将 NSNumber 的内容复制到局部变量中,然后释放 NSMutable 数组的本地副本。

但应用程序在释放这个 NSMutable 数组(变量 'mutArray')时崩溃。

方法如下:

-(void)doNinjaAction
 {
   NSMutableArray* mutArray = [self processPoints: x :y];

   NSNumber* s1 = [[mutArray objectAtIndex:0] retain];
   NSNumber* s2 = [[mutArray objectAtIndex:1] retain];

   x = [s1 integerValue];
   y = [s2 integerValue];

   //...proceed with other stuff...

   [mutArray autorelease]; //this is where the system crashes. same for 'release'            
                           //instead of 'autorelease'
  }

你能解释一下我在内存释放过程中哪里出错了。

我对这个过程的理解有点不稳定。请帮忙。

【问题讨论】:

  • 它崩溃了,因为你自动释放它两次。

标签: iphone objective-c memory-leaks nsmutablearray


【解决方案1】:

因为您过度释放了数组。你在processPoints: 中分配初始化它,然后自动释放它——没错,这就是你处置它的所有权的方式。

之后,您不需要也不得自动释放或再次释放它。这不是标准库中的malloc()

【讨论】:

    【解决方案2】:

    当你调用语句时

       NSMutableArray* mutArray = [self processPoints: x :y];
    

    这本身就是自动释放。

    因此显式释放数组会导致应用崩溃。

    【讨论】:

      【解决方案3】:

      您不止一次释放 mutArray。一次进入processPoints 函数,再次进入doNinjaAction

      要解决崩溃删除:

      [mutArray autorelease];
      

      【讨论】:

      • “尝试在那里打印保留计数,这样你就会明白哪里出了问题” - He'll be even more confused if he does that.
      • 不客气。请与任何想提供此建议的人分享此链接:)
      • 感谢所有回复。现在我明白了......如果我不再使用显式发布,它工作顺利而且很好!也没有内存泄漏......我猜。再次感谢所有帮助。 :)
      【解决方案4】:
      -(NSMutableArray *)processPoints:(int) x:(int) y
       {
       NSMutableArray *mutArray = [[NSMutableArray alloc] initWithCapacity:3];
       int x9,y9;
      
       // ...do some processing...
      
       NSNumber* xNum = [NSNumber numberWithInt:x9];
       NSNumber* yNum = [NSNumber numberWithInt:y9];
      
       [mutArray addObject:xNum];
       [mutArray addObject:yNum];
      
      [mutArray autorelase];
        return mutArray;
       }
      

      试试这个就解决了。

      【讨论】:

        【解决方案5】:
        -(NSMutableArray *)processPoints:(int) x:(int) y
         {
         NSMutableArray *mutArray =[[[NSMutableArray alloc] initWithCapacity:3]autorelease];
         int x9,y9;
        
         // ...do some processing...
        
         NSNumber* xNum = [NSNumber numberWithInt:x9];
         NSNumber* yNum = [NSNumber numberWithInt:y9];
        
         [mutArray addObject:xNum];
         [mutArray addObject:yNum];
        
          return mutArray;
         }
        

        【讨论】:

          【解决方案6】:

          正如@H2CO3 和@AppleDelegate 建议的那样,这是正确的。

          我仍然建议使用 ARC 并将您的项目转换为启用 ARC。

          转到编辑->重构->转换为Objectiv-C ARC

          那么您不需要在任何地方进行任何发布。它会自行处理所有版本:)

          【讨论】:

          • 谁投了反对票我可以认识吗?给我理由
          猜你喜欢
          • 2013-01-27
          • 1970-01-01
          • 1970-01-01
          • 2014-03-10
          • 2011-09-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-11
          相关资源
          最近更新 更多