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…]
初始值设定项路径,因此不会双重初始化,这就是您看到的问题的原因。我认为在这两种情况下,我都称为指定初始值设定项,不是吗?