설명서를 볼 때 큰 차이는 거의 없습니다. "value"및 "object"는 모두 id 유형 이므로 모든 객체가 될 수 있습니다. 키는 한 번 문자열이고 다른 경우에는 id입니다. 그들 중 하나는 물체를 유지하는 것처럼 보이고 다른 하나는 그렇지 않습니다. 또 뭐요? 어떤 경우에 해당됩니까?
설명서를 볼 때 큰 차이는 거의 없습니다. "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:
하면 예외가 발생합니다.
dic[key] = value;
value가 인 경우 키 제거를 지원하도록 작성할 수 있습니다 nil
. 아래 첨자는 일반적으로 setValue:forKey:
이를 수행 하는 것보다 더 나은 방법 입니다.
-setValue:forKey:
바로 보낼 -setObject:forKey:
값이 아닌 경우, 수신기로 nil
,이 경우 전송에-removeObjectForKey
.
간단하다.
anObject — 키 값입니다. 개체는 메시지를 추가하기 전에 보존 메시지를받습니다.NSDictionary
. 이 값은 0이 아니어야합니다.
aKey — 값의 키입니다. 키가 복사됩니다 ( copyWithZone:
; 키 사용은 키를NSCopying
프로토콜을 ). 키는 0이 아니어야합니다.
값 — 키 값입니다.
key — 값의 키입니다. 키-값 코딩을 사용할 때 키는 문자열이어야합니다 (“키-값 코딩 기초”참조).