NSMutableDictionary에서 setObject : forKey :와 setValue : forKey :의 차이점은 어디에 있습니까?


153

설명서를 볼 때 큰 차이는 거의 없습니다. "value"및 "object"는 모두 id 유형 이므로 모든 객체가 될 수 있습니다. 키는 한 번 문자열이고 다른 경우에는 id입니다. 그들 중 하나는 물체를 유지하는 것처럼 보이고 다른 하나는 그렇지 않습니다. 또 뭐요? 어떤 경우에 해당됩니까?


답변:


163

setValue:forKey:NSKeyValueCoding 프로토콜의 일부로 , 무엇보다도 Interface Builder와 같은 객체 속성에 액세스 할 수 있습니다. setValue:forKey:이외의 클래스에서 구현됩니다 NSDictionary.

setObject:forKey:이다 NSMutableDictionary's존재하는 이유. 서명은 setValue : forKey :와 매우 유사하지만 더 일반적입니다 (예 : 모든 키 유형). 서명이 너무 비슷하다는 것은 우연의 일치입니다.

혼란을 가중시키는 것은 NSMutableDictionary의 구현이 대부분의 경우 setValue:forKey:와 동일하다는 것 setObject:forKey:입니다. 다른 클래스에서는 setValue:forKey:멤버 변수를 변경합니다. 에서 NSMutableDictionary당신은 '@'문자로 키를 앞에하지 않는 한, 그것은 사전 항목을 변경 -이 경우는 멤버 변수를 수정합니다.

그래서, 간단히 말해서, 사용 setObject:forKey:당신은 사전에 키와 값이 작업에 필요하고 경우에 setValue:forKey:당신이 해결하는 데 필요한 희소의 경우 KVP을 .

편집 : 그리고 오, 이것이 전에 요청되고 응답 된 것처럼 보입니다 : objectForKey와 valueForKey의 차이점은 무엇입니까?


그 질문은 정확히 같지 않습니다. getter 메소드에 관한 것이지만이 질문은 setter 메소드에 관한 것입니다
user102008

1
"NSMutableDictionary에서 키 앞에 접두사 '@'문자를 붙이지 않는 한 사전 항목을 변경합니다.이 경우 멤버 변수를 수정합니다." 어떤 멤버 변수? 또한 당신은 stackoverflow.com/questions/5755917 ? 감사.
피터 Štibraný

완벽을 기하기 위해 setObject : forKey는 객체가 nil 인 경우 예외를 발생시킵니다. setValue : forKey가 동일하게 작동합니까, 키에 대해 nil을 설정할 때 사전에서 기존 객체를 제거합니까?
Motti Shneor

좋은 대답입니다. 정말. 그러나 완전성을 위해 (적어도 NSMutableDictionary에서) setValue : forKey :는 nil 값을 허용하고 항목을 제거합니다. setObject : forKey :는 nil 값을 처리 할 때 예외를 발생시키고 충돌합니다.
Motti Shneor

83

또 다른 차이점은에 nil 값을 주면 setValue:forKey:키가있는 경우 사전에서 키를 제거하고 그렇지 않으면 아무 것도 수행하지 않는다는 것입니다. 그러나에 nil 값을 지정 setObject:forKey:하면 예외가 발생합니다.


10
이것은 매우 유용합니다. 나는 이것을 정확하게 달성하기 위해 NSMutableDictionary에 내 자신의 범주를 작성했습니다!. 감사합니다
Arman

2
또 다른 차이점은 objective-c 아래 첨자와 다르며 dic[key] = value;value가 인 경우 키 제거를 지원하도록 작성할 수 있습니다 nil. 아래 첨자는 일반적으로 setValue:forKey:이를 수행 하는 것보다 더 나은 방법 입니다.
Cœur


4

anObject — 키 값입니다. 개체는 메시지를 추가하기 전에 보존 메시지를받습니다.NSDictionary . 이 값은 0이 아니어야합니다.

aKey — 값의 키입니다. 키가 복사됩니다 ( copyWithZone:; 키 사용은 키를NSCopying 프로토콜을 ). 키는 0이 아니어야합니다.

— 키 값입니다.

key — 값의 키입니다. 키-값 코딩을 사용할 때 키는 문자열이어야합니다 (“키-값 코딩 기초”참조).


setObject : forKey :가 예외를 발생시키는 이유를 알려 주셔서 감사합니다. @breakfreehg
simbesi.com
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.