2015-11-15 60 views
1

我注意到,對象方法的某些引用會創建對該對象的強引用並使其在Swift中保持活動狀態。方法引用使對象在Swift中保持活躍狀態​​

有沒有辦法解決這個問題?是否有可能將方法參考標記爲弱?

class Counter 
{ 
    var n: Int = 0 

    func inc() -> Int 
    { 
     n += 1 
     return n 
    } 
} 

var o: Counter? = Counter() 
weak var w: Counter? = o 
var c:() -> (Int) = o!.inc 

c() // 1 
w?.n 

o = nil 

c() // 2 - object is still alive here 
w?.n // weak reference is also alive here 

回答

1

這是你想要做的嗎?
我注意到金屬樣本應用程序在封閉中有一個弱引用。

class Counter 
{ 
    var n: Int = 0 

    func inc() 
    { 
     n += 1 
     print("new count \(n)") 
    } 

    deinit { 
     print("deinit") 
    } 
} 

var counter: Counter? = Counter() 

var closure:() ->() = { 
    [weak counter] in 
     if let strongRef = counter { 
      print("alive") 
      strongRef.inc() 
     } else { 
      print("dead") 
     } 
} 

closure() 
counter = nil 
closure() 

此打印

alive 
new count 1 
deinit 
dead 
+0

是的,這與我想達到的目標非常接近。 –

+0

恐怕OP會在這裏得出錯誤的結論。如果你從這個答案中刪除了'[弱櫃檯],你會得到完全相同的行爲。 – Rob

1

var c不是一個方法的引用,它是將closure基準 - 的封裝方法的,它需要在其上進行操作的任何對象。在你的情況下,方法inc需要它的Counter對象來完成它的工作,所以Counter保持活着。

保持物體活着的閉合是一個基本特徵。讓對象走的唯一方法是明確地放棄對其實例方法的所有引用。

1

你不能做一個閉包參考weak,但你可以使它可選。

class Counter 
{ 
    var n: Int = 0 

    func inc() -> Int 
    { 
     n += 1 
     return n 
    } 
} 

var o: Counter? = Counter() 
weak var w: Counter? = o 
var c: (() -> (Int))? = o?.inc //this is the crucial part 

c?() // 1 
w?.n 

o = nil 
c = nil 

c?() //nil 
w?.n //nil 
+1

謝謝,但是這意味着我必須設置'C'到'nil'了。我想這是沒有辦法的。 –

相關問題