gpt4 book ai didi

objective-c - 为什么UINavigaionController的子类会调用Default Constructor和Custom Constructor?

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:49:11 25 4
gpt4 key购买 nike

   @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也被调用了。任何帮助将不胜感激。

最佳答案

发生这种情况是因为您没有正确实现初始化器。

在 Objective C 中有一个指定初始化器的概念,它是所有其他初始化器必须调用的类的单个 init 函数。是直接调用[super init]的指定初始化器;所有其他初始化器都需要通过调用指定的初始化器来间接调用 [super init]

在您的特定情况下,您需要将 initinitWithRootViewController: 通用的代码(如果有)移动到 initWithRootViewController: 中初始化程序,并重写普通的 init 如下:

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

** 编辑:**(回应指出此解决方案导致无限递归的评论)我认为你获得无限递归的原因必须具体与 UINavigationController 的实现细节有关,这不应该被继承。根据 Apple 的文档,

The UINavigationController class implements a specialized view controller that manages the navigation of hierarchical content. This class is not intended for subclassing. Instead, you use instances of it as-is in situations where you want your application’s user interface to reflect the hierarchical nature of your content.

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

关于objective-c - 为什么UINavigaionController的子类会调用Default Constructor和Custom Constructor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11934180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com