2
   @implementation NVController
//Plain Init method
-(id)init
{

    self=[super init];
    if(self)
    {
    }
    return self;
}

//CustomInit Method
-(id)initWithRootViewController:(UIViewController *)rootViewController
{

    self=[super initWithRootViewController:rootViewController];
    if(self)`enter code here`
    {
    }
    return self;
}

@end

NVController *instance=[[NVController alloc] initWithRootViewController:nil];

ここで上記の場合、私はのみを呼び出すのでinitWithRootViwController、別のコンストラクターinitも呼び出されます。どんな助けでもいただければ幸いです。

4

2 に答える 2

2

initWithRootViewController:は次のように実装されていると思います:

-(id)initWithRootViewController:(UIViewController *)rootViewController
{
    self=[self init];
    if(self)
    {
        // do something with rootViewController
    }
    return self;
} 
于 2012-08-13T12:24:08.467 に答える
2

これは、初期化子を正しく実装していないために発生します。

Objective C には、指定された初期化子initの概念があります。これは、他のすべての初期化子が呼び出さなければならないクラスの単一の関数です。[super init]直接呼び出すのは、指定された初期化子です。他のすべての初期化子[super init]は、指定された初期化子を呼び出すことによって間接的に呼び出す必要があります。

init特定のケースでは、との両方に共通するコードを初期化子に移動し、プレーンを次のように書き換える必要initWithRootViewController:initWithRootViewController:ありinitます。

-(id)init {
    return [self initWithRootViewController:nil];
}

**編集:** (この解決策が無限再帰を引き起こすことを示すコメントへの応答) 無限再帰が発生する理由は、特にUINavigationController継承されるべきではない の実装の詳細に関係していると思います。Appleのドキュメントによると、

このUINavigationControllerクラスは、階層コンテンツのナビゲーションを管理する特殊なビュー コントローラーを実装します。このクラスは、サブクラス化を意図していません。代わりに、コンテンツの階層的な性質をアプリケーションのユーザー インターフェイスに反映させたい場合は、そのインスタンスをそのまま使用します。

編集: サブクラス化の禁止は iOS 6 で解除されました - UINavigationController のドキュメントを参照してください。

于 2012-08-13T12:25:47.637 に答える