NSMutableArray发布导致崩溃

问题描述:

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

我有一个方法,处理一些数据并返回两个整数值作为NSNumber包装成一个NSMutableArray。

这里是方法:

-(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]; 
} 

我调用上述方法从另一种方法,其中I的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' 
    } 

能否请你解释一下,我正与内存释放的过程中走错了。

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

+0

它正在崩溃,因为你自动释放它两次。 – 2013-02-12 06:32:34

当你调用语句

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

这本身充当自动释放。

因此,明确释放数组会导致应用程序崩溃。

+0

明白了......谢谢。 – metsburg 2013-02-12 07:01:53

您正在释放mutArray多次。一旦进入processPoints功能并再次进入doNinjaAction

要解决的崩溃删除:

[mutArray autorelease]; 
+0

“试着在那里打印保留数,这样你就会明白它出错的地方了” - [如果他这样做,他会更加困惑。](http://whentouseretaincount.com) – 2013-02-12 06:23:03

+0

@ H2CO3:同意。将编辑答案。谢谢。 – Rushi 2013-02-12 06:25:43

+0

不客气。请分享这个链接与谁想给这个建议:) – 2013-02-12 06:27:59

因为你overreleasing数组。你分配 - 在processPoints:初始化它,然后你autorelease它 - 这是正确的,这是你如何处置它的所有权。

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

+0

是的,现在我明白了。谢谢。 – metsburg 2013-02-12 07:02:28

-(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; 
} 

试试这一个它会解决它。

+0

是的....第二次没有释放它也工作正常。非常感谢。 – metsburg 2013-02-12 07:05:34

由于@ H2CO3和@AppleDelegate建议,它是正确的。

不过我会建议使用ARC并将您的项目转换为ARC启用。

转到编辑 - > Refactor->转换为Objectiv-C ARC

然后你不需要做任何版本的任何地方。它会照顾到所有的版本:)

+0

谁投了负面可能我知道男人?给我理由 – Bhupendra 2013-02-12 08:00:31

+0

仅供参考...我试图给你投票...但我不允许... :( – metsburg 2013-02-13 11:25:50

-(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; 
}