#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 — просто обновите свой ответ, он намного лучше моего, и дополнительный будет просто шумом.