我正在阅读 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/