проблема с массивом в didSelectRowAtIndexPath. За границами - PullRequest
0 голосов
/ 08 января 2012

Я пытаюсь перейти к окончательному виду, где будет показана вся информация об элементе.

- (void)tableView:(UITableView *)atableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
Item *itemObj; //object that holds data for cell for current view
ItemShow *itemOverViewObj; //data object for the next view 

if(atableView==self.tableView)
{
    //ordinary tabeView
    itemObj=[self.itemsArray objectAtIndex:[indexPath row]];
}
else
{
    //filtered with search tableView
    itemObj=[self.filteredItems objectAtIndex:[indexPath row]];
}

//The array which will store the data for overview 
NSMutableArray *itemsOverViewArr=[[NSMutableArray alloc]initWithCapacity:1];
DBAccess *access=[[DBAccess alloc]init];

//method for fetching data from db and inserting into array
itemsOverViewArr=[access getItemsOverView:itemObj.itemID];
[access closeDataBase];
[access release];

//here is the evil.
itemOverViewObj=[itemsOverViewArr objectAtIndex:[indexPath row]];
[itemsOverViewArr release];
    ItemOverView *iov=[[ItemOverView alloc]initWithNibName:@"ItemOverView" bundle:nil];
    iov.title=self.nominal;
    [iov setItemShow:itemOverViewObj];
    [self.navigationController pushViewController:iov animated:YES];
    [iov release];
}

То, что я проверял ранее:

Выберите в методе, для которого работает getItemsOverView100%.itemObj.itemID извлекает правильное значение int.

Проблема, возникающая в itemOverViewObj = [itemsOverViewArr objectAtIndex: [строка indexPath]];

Ошибка: * Завершение работы приложения из-за необработанного исключения 'NSRangeException ', причина:' * - [NSMutableArray objectAtIndex:]: индекс 1 за пределами [0 .. 0] '

getItemsOverview meth в классе DBAccess

-(NSMutableArray*)getItemsOverView:(int)itemID
{
NSMutableArray *itemsArray=[[[NSMutableArray alloc]init]autorelease];
const char *sqlItems=sqlite3_mprintf("SELECT itm.itemID,itm.itemYear,itm.rarity,dateComment,itm.mintage,dc.dateCode as dateCode,iaval.availability as avalibility,iaval.quality as quality,itm.Mintmark,itm.specialRemark\
                                     from items itm\
                                     join itemAvailability iaval on iaval.itemID=itm.itemID\
                                     join dateCultures dc ON dc.dateCultureID=itm.dateCulture\
                                     WHERE itm.itemID=%i",itemID);
sqlite3_stmt *statement;
int sqlResult = sqlite3_prepare_v2(database, sqlItems, -1, &statement, NULL);
if ( sqlResult== SQLITE_OK)
{
    while (sqlite3_step(statement) == SQLITE_ROW)
    {
        ItemShow *itemShow=[[ItemShow alloc]init];
        itemShow.itemID=sqlite3_column_int(statement, 0);
        char *itemYear=(char *)sqlite3_column_text(statement, 1);
        char *mintMark=(char *)sqlite3_column_text(statement, 2);
        char *masterMark=(char *)sqlite3_column_text(statement, 3);
        itemShow.rarity=sqlite3_column_int(statement, 4);
        itemShow.availability=sqlite3_column_int(statement, 5);
        itemShow.quality=sqlite3_column_int(statement, 6);
        char *mintage=(char *)sqlite3_column_text(statement, 7);

        itemShow.itemYear=(itemYear)?[NSString stringWithUTF8String:itemYear]:@"";
        itemShow.mintMark=(mintMark)?[NSString stringWithUTF8String:mintMark]:@"";
        itemShow.masterMark=(masterMark)?[NSString stringWithUTF8String:masterMark]:@"";
        itemShow.mintage=(mintage)?[NSString stringWithUTF8String:mintage]:@"Unknown";



        [itemsArray addObject:itemShow];
        [itemShow release];

    }
    sqlite3_finalize(statement);
}
else
{
    [self dbConnectionError];
}

return itemsArray;
}

Спасибозаранее

Ответы [ 3 ]

2 голосов
/ 08 января 2012

Сообщение об исключении говорит само за себя: вы пытаетесь получить доступ ко второму элементу (индекс 1) в itemsOverViewArr, но этот массив содержит только один элемент (индекс 0).

Почему это так, только вы можете сказать, поскольку вы не показываете нам соответствующий код. Но похоже, что [access getItemsOverView:itemObj.itemID] возвращает массив, содержащий 1 элемент.

Кроме того, в вашем коде есть хотя бы одна утечка памяти. Массив, созданный NSMutableArray *itemsOverViewArr=[[NSMutableArray alloc]initWithCapacity:1];, больше не доступен после строки itemsOverViewArr=[access getItemsOverView:itemObj.itemID]; и, следовательно, не может быть освобожден. Тот факт, что вы выпускаете itemsOverViewArr позже, вероятно, также является ошибкой управления памятью (в данном случае перевыпуском), поскольку getItemsOverView: должен возвращать объект с автоматическим освобождением. (Между прочим, вы не должны называть такие методы get..., поскольку это соглашение об именах подразумевает в Какао, что метод возвращает свои результаты через указатель на один из аргументов метода.)

0 голосов
/ 08 января 2012

Похоже, что вы используете делегата для более чем одного tableView

if(atableView==self.tableView)

Убедитесь, что у вас есть доступ к правильному виду таблицы здесь:

itemOverViewObj=[itemsOverViewArr objectAtIndex:[indexPath row]];

или вы получите неправильный индекс в массиве, который может иметь только один элемент с индексом 0, что сделает индекс 1 за пределами границ.

0 голосов
/ 08 января 2012

Что означает:

itemsOverViewArr=[access getItemsOverView:itemObj.itemID];

do?

Если он возвращает массив, объявите ваш NSMutableArray следующим образом:

NSMutableArray * itemsOverViewArr = [[NSMutableArray alloc] initWithArray: [access getItemsOverView:itemObj.itemID]];

И затем также убедитесь, чтопри обращении к нему, чтобы убедиться, что в этом изменяемом массиве есть хотя бы один элемент.

Другими словами:

if(itemsOverViewArr && ([itemsOverViewArr count] > 1)) 
{
    itemOverViewObj=[itemsOverViewArr objectAtIndex:[indexPath row]];
    ...
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...