У меня есть 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 НЕ ИСПОЛЬЗУЕТСЯ нигде, кроме как в этих описанных методах, и все, что я могу прочитать, говорит о том, что это правильный способ сделать это.