我正在使用XCode开发iPhone应用程序。我是这个平台的新手,需要一些特殊问题的帮助...
我有一个处理一些数据的方法,并返回两个整数值作为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];
}
我从另一个方法调用上面的方法,在那里我将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 :(得分:2)
因为你过度释放了数组。你在processPoints:
中分配初始化它,然后你自动发布它 - 这是正确的,这就是你如何处置它的所有权。
之后,您不需要也不得自动释放或再次释放它。这不是标准库中的malloc()
。
答案 1 :(得分:1)
当你致电声明时
NSMutableArray* mutArray = [self processPoints: x :y];
这本身就是自动释放。
因此,显式释放数组将导致应用程序崩溃。
答案 2 :(得分:0)
你发布mutArray一次。进入processPoints
功能后再次进入doNinjaAction
。
解决崩溃问题:
[mutArray autorelease];
答案 3 :(得分:0)
-(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;
}
尝试这个,它会解决它。
答案 4 :(得分:0)
-(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;
}
答案 5 :(得分:-1)
正如@ H2CO3和@AppleDelegate建议的那样,它是对的。
我仍然建议使用ARC并将您的项目转换为启用ARC。
转到Edit-> Refactor->转换为Objectiv-C ARC
然后你不需要在任何地方做任何发布。它会照顾所有版本:)