gpt4 book ai didi

iphone - Objective-C中的自定义init方法,如何避免递归?

转载 作者:搜寻专家 更新时间:2023-10-30 19:50:40 26 4
gpt4 key购买 nike

我想创建一个 UINavigationController 的子类,它总是以相同的根 Controller 开始。没有什么特别的,所以(对我来说)像这样覆盖 init 方法是非常有意义的:

- (id) init {
rootController = [[MyController alloc] init];

if (self = [super initWithRootViewController:rootController]) {
// do some more initialization
}

return self;
}

这显然会产生一个问题,因为[super initWithRootViewController]会调用[UINavigationController init],这当然是我们重写的init方法,所以会出现无限递归。

我不想创建具有不同名称(如“initCustom”)的 init 方法。

目前我只能想出一个解决方案,但我真的很讨厌这种 hack:

- (id) init {
if (initCalled)
return self;

initCalled = YES;

rootController = [[MyController alloc] init];

if (self = [super initWithRootViewController:rootController]) {
// do some more initialization
}

return self;
}

所以我的问题是:是否有更好的处理方法?我确定我遗漏了一些非常明显的东西,但我没有看到。

编辑:我想这样做的原因,可以在下面的评论之一中看出:

我想创建一个始终以特定 View Controller 开头的导航 Controller 。我想对类(class)的消费者隐藏这一点。不需要暴露的东西不需要暴露。让生活更轻松,代码更简洁(发明封装的原因之一,对吧?)

最佳答案

首先,UINavigationController 不适合子类化。

无论如何,最简单的方法是覆盖 initWithRootViewController:

- (id) initWithRootViewController:(UIViewController) viewController {
return [super initWithRootViewController:[[[MyController alloc] init] autorelease]];
}

你最好不要自动释放 MyController,但你明白这个想法......

关于iphone - Objective-C中的自定义init方法,如何避免递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1888970/

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