私はUITableViewControllerを持っていますが、メソッドがWebデータを読み込めなかった場合、テーブルビュー上にエラーメッセージをオーバーレイするために使用されるUIView *はerrorViewと呼ばれます。奇妙な!=なしチェックの問題
initメソッドでは、errorViewはnil(デバッガの0x0)に設定されています。
ロードメソッドで、initの最後に呼び出され、 'refresh' UIButton(errorView上)がタップされている場合、errorViewはnilと比較され、superviewから削除され、デバッガでは0x0)。
deallocメソッドでは、解放前に同じチェックが行われます。何らかの理由で、データが失敗したメソッドが呼び出されなかったため、変数が割り当てられていなくても(デバッガの0xc000)、変数は決してゼロにはなりません。それから、アプリケーションは!= nilのヌルポインタをdeallocしようとするためクラッシュします。
例:
-(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変数は、説明されているようにこれらのメソッド以外の場所では使用されません。読み込むことができるのは、それを行う適切な方法であることが示唆されています。
これは実際のコードですか、それとも最小限のサンプルですか? init()とdealloc()メソッドで、((self = [super init]))と[super dealloc]が呼び出されていない場合、... –
は 'errorView'自体に問題がない可能性があります。あなたは 'UITableViewController'を2回(あるいはあなたが想定している以上に)解放しているかもしれませんか?そのため、 'errorView'変数にガベージを持つ可能性のある無効な' UITableViewController'オブジェクトに対して 'dealloc'メソッドが呼び出されます。 – filipe
これは非常にうまく取り除かれたバージョンであり、はい、元のルーチンに言及しています。 UITableViewControllerは、View Controllerがポップされると自動的に解放されます。 (親ビューコントローラを作成してプッシュした後で) –