程序崩溃 - 可能是内存保留滥用

时间:2011-10-03 02:11:48

标签: objective-c

我有一个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];

1 个答案:

答案 0 :(得分:1)

问题是您在循环内部正在更改temp1temp2的值。在循环完成后释放它们时,您不会释放在循环开始之前创建的对象。相反,您试图释放一些您没有分配/ 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];
}

您不需要在循环之前将新对象实例分配给temp1temp2,因为您只是在循环中覆盖它们的值。

另请注意,如果topTenDataArray中只有一个元素,则代码会调用[topTenDataArray exchangeObjectAtIndex:0 withObjectAtIndex:0],这也可能是一个问题(API docs并不是说你可以不与自己交换对象,但他们也没有说你可以。)