スウィフト配列はクラスが参照型である間は値型であるため、[SomeClass]
のようなものはSomeClass
インスタンスへの参照を含む配列を作成すると考えました。 弱い変数のリリースでのスウィフト配列の混乱
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
でのインスタンスの参照カウントが
array
に
obj
を付加した後2でなければならないと思った、と
obj = nil
と
array.removeFirst()
たら、両方の参照と呼ばれていました:
しかし、スウィフトREPLでは、次の処理が行われインスタンスが解放される必要があります。
しかし、これはそうではないようです。配列部分がなければ、obj
がリリースされているように解放されます。私はここで何が欠けていますか?
はremoveFirst()
で起こって何か、popLast()
と同様の機能があるように思え を追加しました。 (おそらくバグ?)
うまくnil
作品への直接配列インデックスでオブジェクトを設定します。 array
自体が解放されたときしかし
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
にのみリリースされます。
私はあなたが配列から削除すると、 '$ R0'が強い参照 – Alexander
を保持しているかもしれないと思う、' removeFirst'機能削除されたオブジェクトが返されます。これは '$ R0'によって強く参照され、オブジェクトを生かしたままにします。私の答えを見てください。 – Alexander