1

私はプログラムでビューを作成するために使用し、XIBファイルを使用して切り替えを開始しました。私はこのコードを見つけました:

-(id)init
{
    self = [super initWithNibName:@"HelpViewController"  bundle:nil];
    if (self != nil) {
        // further initialization needed
    }

    return self;
}

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    NSAssert(NO, @"Initialize with -init");
    return nil;
}

それは動作しますが、なぜですか?ロジックに従うと、initWithNibNameはnilを返し、selfに設定します。したがって、selfはnilになり、initの最後にselfを返します。まあ、それはあなたがゼロである自己を返すことを意味します。そうですか?

また、NSArrayを初期化する場合、そのinit関数のどこに配置する必要がありますか?

説明してくれてありがとう。

Yko

4

3 に答える 3

3

initメソッドがself=[superinitWithNibName...]を呼び出すためです。したがって、オブジェクトを作成するには、initメソッドを呼び出す必要があります。initWithNibNameを使用すると、失敗します

配列の場合、initメソッドで初期化する必要があります

-(id)init
{
    self = [super initWithNibName:@"HelpViewController"  bundle:nil];
    if (self != nil) {
        // further initialization needed
        myArray = [[NSMutableArray alloc] init];
    }

    return self;
}
于 2012-10-15T19:13:52.173 に答える
1

あなたは2つの異なるinitWithNibName関数を見ています。

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    NSAssert(NO, @"Initialize with -init");
    return nil;
}

上記の関数は、スーパークラスバージョンのinitWithNibNameをオーバーライドしています。呼び出し元にinitを使用するように通知するアサーションを発生させます。

self = [super initWithNibName:@"HelpViewController"  bundle:nil];

上記の行は、ビューコントローラを返すスーパークラスバージョンのinitWithNibNameを呼び出しています。

配列を初期化する場合は、「さらに初期化が必要です」というコメントがある場所で配列を初期化します。

于 2012-10-15T19:11:30.910 に答える
1

これは、self(UIViewControllerのサブクラス)ではなく、super(おそらくUIViewController)で-initWithNibName:bundle:を呼び出しているために機能します。自分でinitWithNibName:bundleを呼び出す場合は、アサーションをヒットするか、アサーションを無効にしている場合はnilを返します。-initWithNibName:bundle:のスーパークラス実装は、実装の影響を受けないため、通常どおりに動作し続けます。

于 2012-10-15T19:53:31.560 に答える