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,不应继承。根据苹果的文档,

该类UINavigationController实现了一个专门的视图控制器,用于管理分层内容的导航。此类不用于子类化。相反,在您希望应用程序的用户界面反映内容的分层性质的情况下,您可以按原样使用它的实例。

编辑:iOS 6 中取消了对子类化的禁令 - 请参阅 UINavigationController 的文档。

于 2012-08-13T12:25:47.637 回答