派生クラスが initWithNibName 呼び出しでスーパー クラスで定義されたプロパティを設定し、viewDidLoad が呼び出されるまでにプロパティが魔法のように再び未定義になるという問題が発生しています。それは次のようになります:
@interface BaseClassController : UIViewController
{
}
@property (copy, nonatomic) NSString *myString; // synthesized in the .m
別のファイルで
@interface DerivedClassController : BaseClassController
{
}
そしてその実装では:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
NSLog(@"Setting MyString stuff");
self.myString = @"Hi Mom";
NSLog(@"Done setting myString");
}
return self;
}
- (void)viewDidLoad
{
NSLog(@"MyString is %@", self.myString); // output as (null)!!!
[...]
}
NSLog の出力によると、順序は正しいです。私は、viewDidLoad が最初に呼び出されていないことを知っています。最初に initWithNibName メソッドが呼び出され、次に viewDidLoad が呼び出されます。viewDidLoad は毎回 self.myString を (null) として報告します。ただし、myString の初期化を viewDidLoad に移動すると、すべて正常に動作します。なんで?ここで本当に明白な何かが欠けているに違いありません..
編集:
これが違いを生むかどうかはわかりませんが、DerivedClassController は、モーダルに表示されるナビゲーション コントローラーのルート ビュー コントローラーです (あらゆる種類の従来の理由により)。
編集2:
コードはスタンドアロンの xcode プロジェクトで期待どおりに機能しますが、最終的に使用する必要があるプロジェクトにインポートすると失敗します。