Какао не может получить доступ к элементу массива после первого индекса?

#objective-c #cocoa

#objective-c #какао

Вопрос:

Почему это сбой?

 NSArray *domain = [webView.request.URL.absoluteString componentsSeparatedByString:@"/"];
NSString *str1 = [domain objectAtIndex:2];
  

Это ошибка, которую я получаю:

 *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSArray objectAtIndex:]: index 2 beyond bounds [0 .. 0]'
  

Я могу использовать objectAtIndex:0 просто отлично.

Комментарии:

1. Это не C , по любым стандартам.

2. @All: Что касается вопроса 2., пожалуйста, проигнорируйте его и не запускайте никаких flamewars. Спасибо!

Ответ №1:

Ошибка говорит о массиве с нулевыми элементами. Тот, о котором вы думаете, содержит более нуля элементов. Вы уверены, что смотрите правильно? Кроме того, если вы вызываете этот код более одного раза, может случиться так, что однажды он использует одно значение, а при следующем запуске другое.

Поставьте точку останова в этой строке и посмотрите, какое значение domain имеет значение на каждой итерации.

Комментарии:

1. Хорошо, допустим, в массиве нет элементов, как мне предотвратить его сбой? Как я могу сначала проверить, существует ли элемент, и продолжить, если он существует?

2. @user969622, используй NSArray count() метод, чтобы узнать, пуст массив или нет, или чтобы узнать, действительно ли существует искомый индекс (если он превышает общее количество элементов, тогда, конечно, он не существует). Для дальнейшего использования взгляните на документацию класса и посмотрите на категорию «Задачи». Вы найдете поддерживаемые методы, классифицированные по их назначению.

3. Я пытался NSMutableArray *domain = [webView.request.URL.absoluteString componentsSeparatedByString:@"/"]; NSInteger *count = [domain count]; , но после последней строки происходит сбой

4. @user969622, никаких проблем. Проверьте документацию, она очень хорошо написана и проиндексирована.

5. @user969622: NSInteger не совпадает с классом и -[NSArray count] возвращает an NSUInteger , а не указатель на an NSInteger . Итак, вам нужно объявить count переменную как NSUInteger count , с U и без * .

Ответ №2:

Вставьте NSLog(@"%@",domain); между этими строками и посмотрите, что вы на самом деле получаете в массиве. Похоже, что в строке, которую вы разделяете, есть косая черта, что даст вам два элемента. Индексы NSArray основаны на нуле, как и массивы C.

почему Cocoa такая чертова боль в *?

Вы просто спотыкаетесь и пытаетесь обучить себя методом проб и ошибок, или вы нашли время, чтобы поработать с каким-либо из руководств?

Комментарии:

1. Это то, что я получаю: "http:", "", "www.google.com", "?q=test" Метод проб и ошибок, а также поиск по учебным пособиям. Не думал, что это будет так сложно. Я пишу несколько строк кода, чтобы сделать то, что я обычно делаю в одной строке…

2. @user969622, пользователи совершенно новых языков программирования, которые они даже никогда раньше не видели, часто пишут несколько строк кода, чтобы сделать то, что они обычно делают в одной строке с языком, который они знают. С практикой это изменится.

3. Если это то, что вы видите в журнале, то objectAtIndex:2 будет работать нормально. Есть ли какой-то другой код между созданием массива и доступом к нему?