我正在阅读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
关键字未被操场识别。这只能意味着操场只支持强引用变量。
那么为什么游乐场只支持强力参考,你能做些什么来阻止游乐场中强烈的参考周期?
答案 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”>“命令行工具”) 这样,您在运行代码时就不需要运行模拟器。