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'
}
能否请你解释一下,我正与内存释放的过程中走错了。
我对这个过程的理解有点不稳定。请帮忙。
当你调用语句
NSMutableArray* mutArray = [self processPoints: x :y];
这本身充当自动释放。
因此,明确释放数组会导致应用程序崩溃。
明白了......谢谢。 – metsburg 2013-02-12 07:01:53
您正在释放mutArray多次。一旦进入processPoints
功能并再次进入doNinjaAction
。
要解决的崩溃删除:
[mutArray autorelease];
“试着在那里打印保留数,这样你就会明白它出错的地方了” - [如果他这样做,他会更加困惑。](http://whentouseretaincount.com) – 2013-02-12 06:23:03
@ H2CO3:同意。将编辑答案。谢谢。 – Rushi 2013-02-12 06:25:43
不客气。请分享这个链接与谁想给这个建议:) – 2013-02-12 06:27:59
因为你overreleasing数组。你分配 - 在processPoints:
初始化它,然后你autorelease它 - 这是正确的,这是你如何处置它的所有权。
之后,你不需要,也不一定自动释放或再次释放它。这不是标准库中的malloc()
。
是的,现在我明白了。谢谢。 – 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;
}
试试这一个它会解决它。
是的....第二次没有释放它也工作正常。非常感谢。 – metsburg 2013-02-12 07:05:34
-(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;
}
它正在崩溃,因为你自动释放它两次。 – 2013-02-12 06:32:34