6

私は NSMapTable がどのように機能するかを理解しようとしています。だから私は遊び場で次のコードを試しています:

class Person {
    var name: String


    init(name: String ) {
        self.name = name
        print("\(name) is being initialized")
    }

    deinit {
        print("\(name) is being deinitialized")
    }
}

var hobyePerson : NSMapTable? = NSMapTable<Person, NSMutableString>
(keyOptions: .weakMemory, valueOptions: .weakMemory)

var rob : Person? = Person(name: "Rob Appleseed") // print : Rob Appleseed is being initialized

hobyePerson?.setObject("golf", forKey: rob)
hobyePerson?.count // return : 1


rob = nil // print : Rob Appleseed is being deinitialized
hobyePerson?.count // return : 1 (WHY ???!!!!)

ドキュメントに書かれているように:「オブジェクトの1つが回収されたときにエントリが削除されるように、キーや値はオプションで「弱く」保持されます。

rob の割り当てが解除されたときにキーと値のペアへの弱い参照を持つようにオブジェクトを初期化したにもかかわらず、hobyePerson にまだ要素があるのはなぜですか?

4

2 に答える 2

6

NSMapTableweak動作オプションは、キー/値がいつ解放されるかを気にしない場合に最適に機能しますが、むしろ、キー/値が強く保持されず、対象のオブジェクトが になった後のある時点で解放されることnilを気にします。

なんでそうなの?

Foundation クラスの作成者NSMapTableは、機能とパフォーマンスのバランスを取る必要がありました。

その結果、パフォーマンスの「最適化」として、弱く参照されたオブジェクトがnilマップ テーブルからすぐに削除されないことを選択しました...! むしろ、マップテーブルが内部的にサイズ変更されたときなど、効率的に実行できるときに「後で」発生します。

@Luke も彼の回答で言及しているように、詳細については、NSMapTableの動作で行われた実験に関するこの優れた記事を参照してください。

http://cocoamine.net/blog/2013/12/13/nsmaptable-and-zeroing-weak-references/

于 2017-10-30T20:09:46.993 に答える