我正在阅读 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") }
}

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

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

那么为什么 Playground 只支持强引用,你可以做些什么来防止 Playground 中的强引用循环呢?

最佳答案

游乐场只是游乐场。它不是现实生活的非常准确的代表。因此,如果它以不同于现实生活的方式对待内存管理,您不应该感到惊讶。 (另一个例子:playground 的顶层显然不像真正的 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消息,证明没有retain循环。如果把unowned关键字删掉再跑,就没有看到两条println消息,证明存在retain循环。因此我们知道 unowned 做了它所宣传的那样。这就是我们需要知道的全部。什么在操场上有效或无效并不是非常重要。

关于swift - 非强引用在操场上不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24600008/

10-13 09:38