16763


お世話になります。

詳解Swiftで、swiftの勉強を始めたところです。

swiftでは、配列などの値型は、Copy-On-Writeの方法で  
最初は配列のポインタだけを渡しデータを共有をしている。  
配列の値が変更されるときに、配列のインスタンスを生成して要素をコピーする。

と説明がありました。

疑問となるのが、配列の要素がクラスインスタンスの場合、  
クラスのリファレンスカウンタは、どうなっているかです。

配列のポインタだけ渡したとしても、要素のクラスインスタンスはリファレンスカウンタは  
カウントアップされていると思っていたらいいのでしょうか。


CC BY-SA 3.0
2015-09-18T07:11:10.233
16741
2015-09-19T00:04:14.683
11148
question
swift
配列型を引数にメソッドを渡したときのクラスインスタンスのリファレンスカウンタ


基本的にCopy-On-Writeの処理は内部で行われるので、普通に配列を扱ってる限り気にする必要はありません。

つまり、インスタンスを入れた配列をコピーした場合、単純に配列の数だけ参照が増えると考えて問題ありません。

以下、簡単な確認用のコードです。  
（Xcode7のPlaygroundで確認）

[code]

    import Foundation
    
    class TestObject {
        let number: Int
    
        init(number: Int) {
            self.number = number
            print("init No.\(number)")
        }
    
        deinit {
            print("deinit No.\(number)")
        }
    }
    
    func test() {
    
        // 配列を作成
        print("1: ------------------")
        var ar1 = [TestObject]()
        ar1.append(TestObject(number: 1))
        ar1.append(TestObject(number: 2))
        ar1.append(TestObject(number: 3))
    
        // 配列をコピーして変更
        print("2: ------------------")
        var ar2 = ar1
        ar2.append(TestObject(number: 10))
    
        // 元の配列を空にする　※このタイミングでは削除されない
        print("3: ------------------")
        ar1.removeAll()
    //  ar2.removeAll() // この行を実行すると、全て削除される
    
        // スコープを抜けるので全て削除される
        print("4: ------------------")
    }
    
    test()
    
[/code]

実行結果

[code]

    1: ------------------
    init No.1
    init No.2
    init No.3
    2: ------------------
    init No.10
    3: ------------------
    4: ------------------
    deinit No.1
    deinit No.2
    deinit No.3
    deinit No.10
    
[/code]


CC BY-SA 3.0
2015-09-19T00:04:14.683
16763
2015-09-19T00:04:14.683
7459
16741
answer