我有一个Objective-C对象数组,要在对象的字段上进行排序。我使用简单的选择排序,因为数组很小。排序工作和正确的数据在数组中,但是在向数组添加大约3或4个对象并且每次崩溃时都使用它。 任何帮助,将不胜感激。错误是EXC_BAD_ACCESS提前谢谢。代码如下:
TopTenDataClass *temp1 = [[TopTenDataClass alloc] init];
TopTenDataClass *temp2 = [[TopTenDataClass alloc] init];
for (int i = 0; i < [topTenDataArray count]; i++)
{
int minIndex = i;
for (int j = i; j < [topTenDataArray count]; j++)
{
temp1 = [topTenDataArray objectAtIndex:minIndex];
temp2 = [topTenDataArray objectAtIndex:j];
if ( temp2.timeInSeconds < temp1.timeInSeconds)
minIndex = j;
}
[topTenDataArray exchangeObjectAtIndex:minIndex withObjectAtIndex:i];
}
[temp2 release]; [temp1 release];
答案 0 :(得分:1)
问题是您在循环内部正在更改temp1
和temp2
的值。在循环完成后释放它们时,您不会释放在循环开始之前创建的对象。相反,您试图释放一些您没有分配/ init的其他对象(在此部分代码中)。可能这就是造成你的崩溃的原因。
我建议尝试类似的事情:
TopTenDataClass *temp1 = nil;
TopTenDataClass *temp2 = nil;
for (int i = 0; i < [topTenDataArray count]; i++)
{
int minIndex = i;
for (int j = i; j < [topTenDataArray count]; j++)
{
temp1 = [topTenDataArray objectAtIndex:minIndex];
temp2 = [topTenDataArray objectAtIndex:j];
if ( temp2.timeInSeconds < temp1.timeInSeconds)
minIndex = j;
}
[topTenDataArray exchangeObjectAtIndex:minIndex withObjectAtIndex:i];
}
您不需要在循环之前将新对象实例分配给temp1
和temp2
,因为您只是在循环中覆盖它们的值。
另请注意,如果topTenDataArray
中只有一个元素,则代码会调用[topTenDataArray exchangeObjectAtIndex:0 withObjectAtIndex:0]
,这也可能是一个问题(API docs并不是说你可以不与自己交换对象,但他们也没有说你可以。)