これは OS X アプリケーションです。カスタムシートを設計しています。私のXIBファイル内には、シートのウィンドウと、ウィンドウ/シート内のビューを制御するNSViewControllerのサブクラスがあります。XIB の所有者は別のコントローラ クラスです。
ウィンドウのコンテンツ ビューに NSTextField を配置しました。NSViewController で、NSTextField の IBOutlet 宣言を作成し、アウトレットが XIB で適切に接続されていることを確認しました。
-[NSViewController setRepresentedObject:] を上書きし、そのメソッド内でpresentedObjectを見て、そのプロパティに応じて、NSTextFieldをスーパービューから削除するか、スーパービューに追加し直します。
テキストフィールドをスーパービューから削除する必要があることを示すpresentedObjectを使用してシートを初めて表示します。これはうまくいきます。
テキストフィールドをスーパービューに追加し直す必要があることを指示するpresentedObjectを含むシートを2回目に表示すると、-[NSView addSubview:]を呼び出すと、アプリケーションがEXC_BAD_ACCESSでクラッシュします。
Running Instruments は、スーパービューに追加しようとした時点で NSTextField がゾンビであったことを示しています。Instruments は、retain/release/autorelease へのすべての呼び出しが AppKit または Foundation によって実行されたことも示しています。そのため、コードのいずれも保持カウントを増減させません。実際、私のコードで IBOutlet を参照している 2 つの行は、-[NSView removeFromSuperview] と -[NSView addSubview:] の呼び出しだけです。
何か間違ったことをしているのですか、それとも OS X のバグですか? XIB がアンロードされない限り、IBOutlet の割り当てを解除しないでください。