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

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



답변

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의 차이점은 무엇입니까?


답변

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


답변

-setValue:forKey:바로 보낼 -setObject:forKey:값이 아닌 경우, 수신기로 nil,이 경우 전송에-removeObjectForKey .

간단하다.


답변

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

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

— 키 값입니다.

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


답변