实例化 - 它做什么?

时间:2015-04-17 18:03:56

标签: ios

作为一个自学成才,或者更确切地说是SO教程的程序员,我想知道你设置变量或let时实际发生了什么。今天,@ Cocoadelica非常友好地为我提供了帮助,为入职用户设置了一个模式。我们决定采用这个解决方案:

AppDelegate.swift

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    let isOnboarded:Bool = NSUserDefaults.standardUserDefaults().boolForKey("Onboarded")

    let storyboard = UIStoryboard(name: "Main", bundle: nil)
    // instantiate your desired ViewController
    let dashboardViewController = storyboard.instantiateViewControllerWithIdentifier("DashboardVC") as! UIViewController
    let onboardingViewControllerOne = storyboard.instantiateViewControllerWithIdentifier("OnboardingVCOne") as! UIViewController

    let window = self.window

    if (isOnboarded) {
            window!.rootViewController = dashboardViewController

        }else{
            window!.rootViewController = onboardingViewControllerOne
    }

    return true
}

但是我注意到它实例化了两个viewControllers,即使逻辑只需要一个。我经常看到这个。我们实例化永远不会使用的变量,而不是在需要它们时。我们为什么要做这个? 它是否对性能没有影响,或者它是否如此之小以至于我们这样做是因为人类是人类并且它使代码更清晰一些?

1 个答案:

答案 0 :(得分:3)

  

我们这样做是因为人类是人类,它可能使代码更清晰一点?

确实如此,但现在让我们谈谈"成本"。视图控制器的实例本身就是一个轻量级对象。并且当该方法返回时,通过将其分配给rootViewController而未保留的那个将被自动销毁,之后只有几分之一毫秒。

所以是的,这是浪费一个实例,但浪费很小,在这种情况下可能不值得担心。

在我看来,它仍然不是世界上最好的风格;我同意你最初的怀疑,即如果我们不必要的话,我们根本不应该实例化。并且可能存在实例化昂贵的情况!所以我个人会这样重写,我怀疑你也会这样:

let window = self.window
if (isOnboarded) {
    let dashboardViewController = storyboard.instantiateViewControllerWithIdentifier("DashboardVC") as! UIViewController
    window!.rootViewController = dashboardViewController
 } else {
    let onboardingViewControllerOne = storyboard.instantiateViewControllerWithIdentifier("OnboardingVCOne") as! UIViewController
    window!.rootViewController = onboardingViewControllerOne
}

顺便说一下,在那个代码片段中还有很多其他愚蠢的东西,所以如果我是你的话,我也不会把它当成任何模型。例如,行let window = self.window没有任何用处,可以完全省略。并且不需要明确的Bool声明; Swift知道boolForKey会产生一个Bool。