Swift數組是指它們是值類型,而類是引用類型,所以我認爲像[SomeClass]
會創建一個包含對SomeClass
實例的引用的數組。Swift數組搞亂了弱變量的發佈
然而,斯威夫特REPL,會發生以下情況:
1> class SomeClass {}
2> var obj: SomeClass? = SomeClass()
obj: SomeClass? = 0x0000000101100050
3> weak var weakObj = obj
weakObj: SomeClass? = 0x0000000101100050
4> var array = [SomeClass?]()
array: [SomeClass?] = 0 values
5> array.append(obj)
6> print(obj, weakObj)
Optional(SomeClass) Optional(SomeClass)
7> array.removeFirst()
$R0: SomeClass? = 0x0000000101100050
8> obj = nil
9> print(obj, weakObj)
nil Optional(SomeClass)
10> print(array)
[]
11> print(Unmanaged.passUnretained(weakObj!).toOpaque())
0x0000000101100050
我想在0x0000000101100050
實例的引用計數應該追加obj
到array
之後是2,而一旦obj = nil
和array.removeFirst()
被稱爲,既引用被刪除,因此該實例應該被釋放。
但是,這似乎並非如此。沒有數組部分,obj
就像它應該發佈一樣。我在這裏錯過了什麼?
ADDED 好像有什麼東西與removeFirst()
,popLast()
和類似的功能怎麼回事。 (可能是一個bug?)
將數組索引處的對象直接設置爲nil
就行了。
102> obj = SomeClass()
103> (weakObj, array) = (obj, [obj])
104> print(obj, weakObj, array)
Optional(SomeClass) Optional(SomeClass) Optional([Optional(SomeClass)])
105> obj = nil
106> array?[0] = nil
$R14:()? = nil
107> print(obj, weakObj, array)
nil nil Optional([nil])
但是,使用removeLast()
或popLast()
時,weakObj
會當array
本身被釋放只釋放。
我想'$ R0'可能持有很強的參考 – Alexander
當你從陣列中,'removeFirst'功能刪除正在返回已刪除的對象。這被'$ R0'強烈地引用,保持你的對象活着。看到我的答案。 – Alexander