Сбой программы - вероятно, из-за неправильного использования памяти - PullRequest
0 голосов
/ 03 октября 2011

У меня есть массив объектов 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 Ответ

1 голос
/ 03 октября 2011

Проблема в том, что внутри вашего цикла вы меняете значения temp1 и temp2.Когда вы отпускаете их после завершения цикла, вы не освобождаете объекты, созданные до начала цикла.Вместо этого вы пытаетесь освободить какой-то другой объект, который вы не выделяли / инициализировать (в этой части кода).Вероятно, это то, что вызывает ваш сбой.

Я бы предложил попробовать что-то вроде:

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 * 1015)* не говорите, что вы не можете обменять объект на себя, но они также не говорят, что вы можете).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...