Ios UINavigationController子类的方便初始化使子类常量init变为两次
我有Ios UINavigationController子类的方便初始化使子类常量init变为两次,ios,swift,uinavigationcontroller,Ios,Swift,Uinavigationcontroller,我有UINavigationController和UITableViewController的子类 为了初始化子类,我决定使用一些便利init方法来调用超类的一些指定初始值设定项。此外,每个子类都有一些let常量: let someValue: SomeClass = SomeClass() 通过调用其新创建的便利init方法,可以成功初始化每个类 问题是UINavigationController子类中的let常量初始化了两次 import UIKit import PlaygroundSu
UINavigationController
和UITableViewController
的子类
为了初始化子类,我决定使用一些便利init
方法来调用超类的一些指定初始值设定项。此外,每个子类都有一些let
常量:
let someValue: SomeClass = SomeClass()
通过调用其新创建的便利init
方法,可以成功初始化每个类
问题是UINavigationController
子类中的let
常量初始化了两次
import UIKit
import PlaygroundSupport
final class Navigation: UINavigationController {
convenience init(anyObject: Any) {
self.init(rootViewController: UIViewController())
}
let service = Constant("Constant Initialization -> Navigation")
}
final class Table: UITableViewController {
convenience init(anyObject: Any) {
self.init(style: .plain)
}
let service = Constant("Constant Initialization -> Table")
}
class Constant: NSObject {
init(_ string: String) {
super.init()
debugPrint(string)
}
}
Navigation(anyObject: NSNull())
Table(anyObject: NSNull())
我们是否可以像上面那样使用便利初始化?为什么?
为什么这两种情况下的便利初始化
行为不同?
检查版本:版本8.2 beta(8C30a)、版本8.2(8C38)、版本8.2.1(8C1002)
以上代码的p.S.操场日志:
"Constant Initialization -> Navigation"
"Constant Initialization -> Navigation"
"Constant Initialization -> Table"
所以这似乎是斯威夫特奇怪的“预期行为”。发生这种情况的原因是由于常量初始化属性
服务
。也就是说,这篇文章总结了你所看到的问题:
基本上,由于Obj-C初始化模式,Obj-C基础超类正在泄漏内存,并且您的服务
属性被初始化两次:
- (id)init {
self = [super init];
if (self) {
self = [[self.class alloc] initWithNibName:nil bundle:nil];
}
return self;
}
避免这种情况的简单解决方案是以下模式:
import UIKit
final class NavigationController: UINavigationController {
var service: ObjectTest?
convenience init() {
self.init(rootViewController: UIViewController())
self.service = ObjectTest("init nav")
}
}
class ObjectTest: NSObject{
init(_ string: String) {
super.init()
print(string)
}
}
实现的所有变化都是在类本身初始化之后才初始化服务
不过,另一个解决方案是为初始化的超类使用指定的初始值设定项。这意味着您不需要使用使用上述Obj-C初始化模式的方便初始值设定项 谢谢你的回答。我仍然不明白为什么便利初始化行为在这两种情况下是不同的?因此便利初始化使用上述Objective-C示例初始化模式,其中有两个init调用([super init]
和[self.class alloc]init…]
。根据我的理解,指定的初始值设定项将直接进入[self.class alloc]init…]
初始值设定项路径,因此不会双重初始化,这就是您看到的问题的原因。我认为在这两种情况下,我都称为指定初始值设定项,不是吗?