2017-10-27 1 views
2

작동 방법 : "키 및/또는 값이 선택적으로 개최 다음 documentation에 작성된NSMapTable 내가 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 ???!!!!) 

을 개체 중 하나가 재생 될 때 항목이 제거되도록 "약하게"

왜 내가 rob을 할당 해제 할 때 키 - 값 쌍에 대한 약한 참조를 갖도록 객체를 초기화하더라도 hobyePerson에 여전히 요소가 있습니까?

+0

이 http://cocoamine.net/blog/2013/12/13/nsmaptable-and-zeroing-weak-references/ 답변에 대한 –

답변

1

예, 이상하고 불행한 행동입니다. This article은 약간 깊이 들어가 있습니다. 특히 약한 것에서 약한 것을 탐색하지는 않지만 설명 된 동작은 같습니다. 저자의 말에 따르면, hobyePerson.keyEnumerator().allObjects.counthobyePerson.objectEnumerator().allObjects.count에는 모두 0이 포함될 것입니다. 그는 또한 애플이 Mountain Lion release notes에서 이런 행동을 문서화했다고 지적한다. 밖으로 zero'd 얻을 약한 키에 대한 강한 값이 될 때까지 이/멀리 클리어 (및 해제)하지 않는 으로 약한 - 투 - 강력한 NSMapTables 현재 사용하지 않는 것이 좋습니다 그러나

, 맵 테이블의 크기를 조절하지 않는 한 그 자체.

죄송합니다. 더 좋은 설명이 아닙니다. 당신이 키/값이 출시되면 을 상관하지 않는 경우

+0

감사 내 생각 이 시점에서 NSMapTable에는 문제가 있습니다. hobyePerson에서 사전을 생성하면 다음과 같습니다. var hobyePersonDic = ? hobyePerson .dictionaryRepresentation() 이 줄을 추가 : hobyePerson : 강탈을 추가 한 후 hobyePersonDic .isEmpty 를? .setObject ("golf", forKey : rob) 및 dealloc rob 이후 rob = nil 언제나 사실입니다. 키 - 값 쌍이 실제로 제거되는지 여부는 알 수 없습니다. – emacos

1

NSMapTableweak 행동 옵션은 가장 효과가 아니라, 당신은 키/값이 강력하게 유지되지 않도록 신경 않으며 가에서 발매 예정 관심 대상이 된 후 어떤 점은 nil이됩니다.

왜 그렇습니까?

Foundation 클래스 인 작성자 NSMapTable은 기능과 성능의 균형을 유지해야했습니다.

결과적으로 "최적화"는 nil이되는 약하게 참조 된 개체가지도 테이블에서 즉시 제거되지 않도록 선택했습니다 ...! 오히려 효율적으로 수행 할 수있는 경우 (예 :지도 테이블 내부적으로 크기가 조정 된 경우 등)에 "나중에"발생합니다.

@ 루크 (Luke)도 자신의 대답에 언급했듯이 NSMapTable 자세한 내용은 '의 행동 :

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

관련 문제