非强力参考不在游乐场工作

时间:2014-07-06 20:24:30

标签: swift xcode6

我正在阅读swift编程指南,在初始化器章节中,我遇到了这段代码:

class Customer {
    let name: String
    var card: CreditCard?
    init(name: String) {
        self.name = name
    }
    deinit { println("\(name) is being deinitialized") }
} 

class CreditCard {
    let number: Int
    unowned let customer: Customer
    init(number: Int, customer: Customer) {
        self.number = number
        self.customer = customer
    }
    deinit { println("Card #\(number) is being deinitialized") }
}

所以我尝试自己尝试代码并进行一些更改,看看会发生什么(让我了解更多)

所以我打开了操场并开始输入,之后我注意到weak关键字和unowned关键字未被操场识别。这只能意味着操场只支持强引用变量。

那么为什么游乐场只支持强力参考,你能做些什么来阻止游乐场中强烈的参考周期?

2 个答案:

答案 0 :(得分:4)

操场只是一个操场。它不是现实生活中非常精确的代表。因此,如果它将内存管理与现实生活区别对待,那么您不应该感到惊讶。 (另一个例子:游乐场的顶层显然不像真正的Swift文件的顶层,因为你可以把那些不是声明的东西放在那里并且它们起作用。)

您可以使用游乐场以交互方式开发算法,但只有现实生活(即可编译的可执行文件 .swift 文件)才是现实生活。

例如,我把它放在实际iOS应用程序的App Delegate中:

import UIKit

class Customer {
    let name: String
    var card: CreditCard?
    init(name: String) {
        self.name = name
    }
    deinit { println("\(name) is being deinitialized") }
}

class CreditCard {
    let number: Int
    unowned let customer: Customer
    init(number: Int, customer: Customer) {
        self.number = number
        self.customer = customer
    }
    deinit { println("Card #\(number) is being deinitialized") }
}

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: NSDictionary?) -> Bool {
        self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
        // Override point for customization after application launch.
        self.window!.backgroundColor = UIColor.whiteColor()
        self.window!.makeKeyAndVisible()

        var cust = Customer(name:"Matt")
        var cc = CreditCard(number:1234, customer:cust)
        cust.card = cc

        return true
    }
}

我看到了两条println消息,证明没有保留周期。如果我删除了unowned关键字并再次运行,我没有看到两条println消息,证明 是保留周期。因此,我们知道unowned做了广告宣传的内容。这就是我们需要知道的全部内容。在操场上工作或不起作用的东西并不是非常重要。

答案 1 :(得分:1)

您还可以创建一个控制台应用程序(“新建项目”>“ macOS”>“命令行工具”) 这样,您在运行代码时就不需要运行模拟器。