objectAtIndex возвращает ошибку SIGABRT - PullRequest
1 голос
/ 27 мая 2011

У меня есть эта строка:

 NSString *objectkey=[NSString stringWithFormat:@"%@",[line objectAtIndex:1]];

Если objectAtIndex: 0, он работает нормально.Но если 1, то во время выполнения выдает ошибку SIGABRT.

Однако у меня есть еще одна строка, чтобы подтвердить, что массив "line" имеет объект с индексом 1:

   NSLog(@"%d",[line count]);

Это возвращает 2на консоль.

Почему возникает SIGABRT, даже если там должен существовать индекс?

Что касается строки, он создается так:

for (int i=1;i<=[components count];i++){

    NSArray*line=[[components objectAtIndex:(i-1)] componentsSeparatedByString:@"|"];

"строка"воссоздается во время каждой итерации цикла (я предполагаю, что это нормально? освобождение не требуется, из того, что я понимаю, используя метод «разделенных строкой»).

массив «компоненты» содержит строки, такие как:

Книги рецептов | КНИГИ

Фотографии рецептов | ФОТОГРАФИИ

Я создал этот маленький цикл, чтобы убедиться, что все строки в "строке":

 for( NSObject* obj in line )
    {
        NSLog(@"%@",obj);
        if ([obj isKindOfClass:[NSString class]]==YES) { NSLog(@"string"); }
    }

Ответы [ 2 ]

0 голосов
/ 27 мая 2011

Скорее всего, объект, содержащийся в [line objectAtIndex:1], не является NSString*. Почему бы вам не попробовать перебрать набор объектов в line и вывести их с NSLog. Я предполагаю, что второй собирается напечатать адрес (в форме <Classname: 0x0>, а не строку.

for( NSObject* obj in line )
{
   NSLog(@"%@",obj);
}

Добавьте NSLog к коду, в котором вы создаете line:

for (int i=1;i<=[components count];i++){
    NSLog(@"%@",[components objectAtIndex:(i-1)]);
    NSArray*line=[[components objectAtIndex:(i-1)] componentsSeparatedByString:@"|"];
<Ч />

У меня сильное чувство, что ваши входные данные неверны, поскольку вы исключили наши предыдущие ответы в качестве решения с вашими ответами. Ваши входные данные могут иметь <cr> там, где они не принадлежат или отсутствуют данные. Насколько велик входной файл для components?

<Ч />

Второй ответ на основе результатов GDB

Попробуйте использовать [NSString stringWithString:[line objectAtIndex:1]] вместо stringWithFormat. Исходя из того, что вы используете gdb, вполне вероятно, что stringWithFormat нарушает работу неожиданного управляющего символа (и пытается его отформатировать). stringWithString должен копировать строку символ за символом. Удаление контрольного символа (символов) является еще одной проблемой. :)

0 голосов
/ 27 мая 2011

Предполагая, что в индексе 1 вашей строки NSArray есть допустимый объект, вероятным ответом будет то, что это не NSString, это какой-то другой класс, который нельзя преобразовать с помощью% @ в вашем вызове stringWithFormat :.Посмотрите на стек, где он прерывается, и вы также можете проверить тип объекта перед вызовом stringWithFormat: call.

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