iOS/Objective-C: добавление объекта NSString в NSMutableArray, значение NSMutableArray равно (null)

#objective-c #ios #nsstring #nsmutablearray

#objective-c #iOS #nsstring #nsmutablearray

Вопрос:

 - (void)webViewDidFinishLoad:(UIWebView *)webView {
if (urlIndex == maxIndex) { 
    maxIndex = maxIndex   1;

    NSString* sURL = webpage.request.URL.absoluteString;

    [urlHistory addObject:sURL];
    NSLog(@"%d: %@", urlIndex, [urlHistory objectAtIndex:urlIndex]);
    NSLog(@"%d: %@", urlIndex, webpage.request.URL.absoluteString);


    [sURL release];

    urlIndex = urlIndex   1;
}
else {
    [urlHistory insertObject:webView.request.URL.absoluteString atIndex:(urlIndex - 1)];
}
}
 

Эта строка

     NSLog(@"%d: %@", urlIndex, [urlHistory objectAtIndex:urlIndex]);
 

выводит (null), в то время как в этой строке

     NSLog(@"%d: %@", urlIndex, webpage.request.URL.absoluteString);
 

выводит фактический URL-адрес.

В моем initWithNibName у меня есть:

 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:@"Tab1ViewController" bundle:nil];

if (self) {
    urlHistory = [[NSMutableArray alloc] init];
    urlIndex = 0;
    maxIndex = 0;
}

return self;
}
 

Но я все еще продолжаю получать (null) при доступе к моему массиву. Почему это так?

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

1. Это опечатка в вашем вопросе, вы добавляете объекты в urlIndex (предположительно целое число), а не urlHistory?

2. Да, это исправлено, спасибо, но это было в нерелевантной строке…

3. Нерелевантных строк нет 🙂

Ответ №1:

Похоже, ваш urlHistory объект nil . Вызов -objectAtIndex: nil объекта вернет nil результат. Вероятно, вы забыли инициализировать urlHistory в своем -init , или вы на самом деле не вызываете -init метод, который, по вашему мнению, вы используете (например, если ваш VC загружается из nib, он будет использоваться -initWithCoder: вместо -initWithNibName:bundle: ).

Для записи, если -objectAtIndex: on NSArray когда-либо возвращается nil , это означает, что сам массив есть nil . Поскольку NSArray невозможно сохранить nil , -objectAtIndex: с допустимым индексом никогда не вернется nil , а -objectAtIndex: с недопустимым индексом будет выдано исключение. Таким образом, единственный способ -objectAtIndex: вернуть nil — это если сам метод фактически никогда не вызывается.

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

1. @Gibson: я не могу ответить на этот вопрос без доступа ко всему вашему коду, но вы можете убедиться, что это то, что происходит, просто выйдя из NSLog(@"urlHistory: %@", urlHistory) системы. Вы должны увидеть urlHistory: (null) выход из системы.

2. @gibson, ты точно создаешь контроллер, используя initWithNibName? Вы вошли в этот метод?

3. @Gibson: если ваш контроллер представления создается внутри пера (например, сам VC находится в пере), тогда он использует -initWithCoder: вместо -initWithNibName:bundle: .

4. @jrturton: Да, я тоже видел его комментарий, в котором говорилось об этом, поэтому я не предположил, что у него был неправильный метод инициализации.

5. @KevinBallard — просто обновите свой ответ, он намного лучше моего, и дополнительный будет просто шумом.