2014-07-06 19 views
2

我讀了迅速節目指南的工作,並在初始化章節中,我碰到這個代碼就來了:非強引用不是在操場

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

你說什麼「弱關鍵字和無主關鍵字不被操場識別」是什麼意思?你對這種說法有什麼檢驗或證據? – matt

回答

3

操場只是一個操場。它並不是現實生活中非常確切的代表。所以,如果它將內存管理與現實生活區別開來,你不應該感到驚訝。 (另一個例子:遊樂場的頂層顯然不像一個真正的Swift文件的頂層,因爲你可以把那些沒有聲明的東西放在那裏,並且它們工作。)

你可以使用操場來開發算法交互,但只有真實生活(即可編譯的可執行文件)是真實的生活。

例如,我把這個在實際的iOS應用的應用代表:

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做它做廣告做。這就是我們需要知道的。在操場上有效或無效的東西並不是非常重要。

+0

如果您在操場上遇到問題,請提交錯誤報告,但是我個人認爲蘋果公司的人員有更大的魚可以在現在炒。就我個人而言,我幾乎無法獲得操場上的工作。 – matt

+0

雅我也注意到了,但是你提到了一些我之前遇到的情況,當我試圖將一些操場代碼複製到一個真正的項目「頂級」時,如果能向我解釋頂級的含義,我將不勝感激。 –