Странно! = Ноль проблем с проверкой - PullRequest
0 голосов
/ 07 января 2011

У меня есть UITableViewController, который имеет UIView * с именем errorView, который используется для наложения сообщения об ошибке на табличное представление, если метод не может загрузить веб-данные.

В методе init для errorView задано значение nil (0x0 в отладчике).

В методе загрузки, вызываемом в конце init AND, если нажата кнопка «refresh» UIB (на errorView), errorView сравнивается с nil, удаляется из superview и освобождается, если он не равен nil (все равно показывает 0x0 в отладчике).

В методе dealloc такая же проверка выполняется перед освобождением; но по какой-то причине переменная никогда не равна nil, даже если она не была назначена (0xc000 в отладчике), потому что метод с ошибкой данных никогда не вызывался. Затем приложение аварийно завершает работу, поскольку оно пытается освободить пустой указатель, равный! = Nil.

Пример:

-(id)init {
    errorView = nil;
    [self Load];
}

-(void)Load {
    if(errorView != nil) {
        [errorView removeFromSuperView];
        [errorView release];
        errorView = nil;
    }

    //Attempt to load data from web
}

-(void)dataFailedToLoad (e.g. UIWebView didFailLoadWithError) {
    errorView = [[UIView alloc] initWithFrame, etc];
    [self.tableView addSubview:errorView];
}

-(void)dealloc {
    if(errorView != nil)
        [errorView release]; //Always crashes because errorView is never nil even though it has been assigned nil?
}

Я тяну волосы за это. Переменная errorView НЕ ИСПОЛЬЗУЕТСЯ нигде, кроме как в этих описанных методах, и все, что я могу прочитать, говорит о том, что это правильный способ сделать это.

Ответы [ 3 ]

3 голосов
/ 07 января 2011

как достопримечательность;отправка сообщения нулевому объекту не является ошибкой;значительное количество ваших чеков совершенно бесполезно.

На то, что здесь происходит, трудно указать без дополнительной информации;если dataFailedToLoad на самом деле - единственное место, где назначен errorView, ваш код должен работать.Тем не менее, его ошибка указывает на то, что что-то еще мешает вашему пику.

Кстати, пустой указатель, который!

1 голос
/ 07 января 2011

Только потому, что вы вызвали init, представление не нужно инициализировать. Вы должны использовать стандартный метод viewDidLoad, чтобы убедиться, что представление не ноль.

0 голосов
/ 07 января 2011

Вы уверены, что говорите с экземпляром, с которым, как вы думаете, вы разговариваете?

Я видел довольно много SO вопросов, которые сводились к путанице между тем, что инстанцирует загрузка файла интерфейса (xib) и тем, что нужно создать разработчику.

т.е. сделайте что-то вроде NSLog(@"%@ %p", self, self); во всех методах и убедитесь, что адрес - экземпляр - один и тот же.

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