iOS / Objective-C: при добавлении объекта NSString в NSMutableArray NSMutableArray равен (null) - PullRequest
0 голосов
/ 01 ноября 2011
- (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]);

печатает (ноль), в то время как эта строка

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

печатает фактический URL.

На моем initWithNibName Iесть:

- (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;
}

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

1 Ответ

6 голосов
/ 01 ноября 2011

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

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

...