objectForKey와 valueForKey의 차이점은 무엇입니까?
사이의 차이점은 무엇입니까?objectForKey
그리고.valueForKey
저는 서류에서 둘 다 찾아봤는데, 제가 보기에는 똑같았습니다.
objectForKey:
입니다.NSDictionary
방법.안NSDictionary
는 와유수클래니다입스와 입니다.NSArray
인덱스를 사용하는 대신 키를 사용하여 항목을 구분합니다.키는 제공하는 임의 문자열입니다.두 키를 수 로, 두 키를 가질 수 .NSArray
동일한 인덱스를 가질 수 있음).
valueForKey:
는 KVC 방식입니다.모든 클래스에서 작동합니다. valueForKey:
이름에 문자열을 사용하여 속성에 액세스할 수 있습니다.에 제가 들어예를만에가 , 제가약서.Account
이 재을소계급인 입니다.accountNumber
다음 작업을 수행할 수 있습니다.
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setAccountNumber:anAccountNUmber];
NSNumber *anotherAccountNumber = [newAccount accountNumber];
KVC를 사용하여 속성에 동적으로 액세스할 수 있습니다.
NSNumber *anAccountNumber = [NSNumber numberWithInt:12345];
Account *newAccount = [[Account alloc] init];
[newAccount setValue:anAccountNumber forKey:@"accountNumber"];
NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"];
이들은 동등한 진술의 집합입니다.
당신이 생각하고 있다는 것을 압니다: 와우, 하지만 비꼬는 것.KVC는 그렇게 유용해 보이지 않습니다.사실, 그것은 "말투성"으로 보입니다.하지만 런타임에 무언가를 바꾸고 싶을 때, 다른 언어에서 훨씬 더 어려운 멋진 일들을 많이 할 수 있습니다(그러나 이것은 질문의 범위를 벗어납니다).
KVC에 대해 더 알고 싶다면, 특히 Scott Stevenson의 블로그에서 Google을 사용하면 많은 튜토리얼이 있습니다.NSKeyValueCoding Protocol Reference도 확인할 수 있습니다.
을 할 때는.valueForKey:
, 당은그것 NS 스줄있지만필가반면, 에요신에을.objectForKey:
임의의 NSObject 하위 클래스를 키로 사용할 수 있습니다.이는 키-값 코딩의 경우 키가 항상 문자열이기 때문입니다.
사실, 문서에 따르면, 당신이 당신에게valueForKey:
을 objectForKey:
이 " 든문다음시이않작는한지하"로 시작하지 한.@
그런 경우에 그것은 발생합니다.[super valueForKey:]
을 면쩌어라고 .valueForUndefinedKey:
예외가 될 수도 있습니다.
사용해야 하는 좋은 이유는 다음과 같습니다.objectForKey:
대신에 가능한 한valueForKey:
-valueForKey:
수 없는 하면 알수없키던집다니로는을 던집니다.NSUnknownKeyException
키 값 호환되지 라고 . "."라는 메시지가 표시됩니다.라고 말합니다.
말씀하신 것처럼,objectForKey:
은 "데이터 유형"입니다.:(id)aKey
에 면에반은valueForKey:
은 "데이터 유형"입니다.:(NSString *)key
.
예:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:[NSArray arrayWithObject:@"123"],[NSNumber numberWithInteger:5], nil];
NSLog(@"objectForKey : --- %@",[dict objectForKey:[NSNumber numberWithInteger:5]]);
//This will work fine and prints ( 123 )
NSLog(@"valueForKey : --- %@",[dict valueForKey:[NSNumber numberWithInteger:5]]);
//it gives warning "Incompatible pointer types sending 'NSNumber *' to parameter of type 'NSString *'" ---- This will crash on runtime.
그렇게,valueForKey:
메서드인 , KVC는 KVC입니다. 반면objectForKey:
모든 유형의 개체를 사용합니다.
값objectForKey
동일한 종류의 개체에 의해 액세스됩니다.
이 표는 다음과 같은 4가지 차이점을 나타냅니다.objectForKey
그리고.valueForKey
.
objectForKey | valueForKey | |
---|---|---|
작업 대상... | NS 사전 | NS 사전 / KVC |
예외를 던집니다. | 아니요. | 예(KVC에서) |
먹이다 | NSObject의 하위 클래스 | NS 문자열 |
KVC에서의 사용 | 수 없다 | 할 수 있다 |
여기에 포괄적인 답변을 제공하도록 노력하겠습니다.대부분의 요점은 다른 답변에 나타나지만, 저는 각각의 답변이 불완전하고 일부는 틀렸습니다.
무엇보다도,objectForKey:
이다.NSDictionary
방법, 동안valueForKey:
NSDictionary를 포함한 모든 KVC 불만 클래스에 필요한 KVC 프로토콜 방법입니다.
게다가, @dreamlax가 썼듯이, 문서는 다음을 암시합니다.NSDictionary
그것을 수행합니다.valueForKey:
그것을 이용한 방법objectForKey:
실행.다시 말해서 -[NSDictionary valueForKey:]
에 대한 요구.[NSDictionary objectForKey:]
.
이것은 의미합니다.valueForKey:
보다 더 빠를 수는 없습니다.objectForKey:
(동일한 입력 키에 대해) 철저한 테스트를 수행했지만, 대규모 NS Dictionary에 대한 수십억 개 이상의 랜덤 액세스에서 약 5%에서 15%의 차이를 보였습니다.정상적인 상황에서 차이는 무시해도 될 정도입니다.
다음: KVC 프로토콜은 다음과 함께만 작동합니다.NSString *
키, 따라서valueForKey:
다음만 수락합니다.NSString *
(또는 하위 클래스) 키로서, 반면NSDictionary
다른 종류의 개체를 키로 사용하여 "하위 레벨"로 작업할 수 있습니다.objectForKey:
복사 가능(NSCopying Protocol 호환) 개체를 키로 수락합니다.
난지.NSDictionary's
의 valueForKey:
는 KVC를 .NSUnknownKeyException
는 " 수 . - 기능 키(예: "" 기능 키)를합니다.@"@sum, @"@avg"
NS때합니다. - " Dictionary"와 을 합니다objectForKey:
다음은 제 노트를 시연하고 증명하기 위한 몇 가지 테스트 코드입니다.
- (void) dictionaryAccess {
NSLog(@"Value for Z:%@", [@{@"X":@(10), @"Y":@(20)} valueForKey:@"Z"]); // prints "Value for Z:(null)"
uint32_t testItemsCount = 1000000;
// create huge dictionary of numbers
NSMutableDictionary *d = [NSMutableDictionary dictionaryWithCapacity:testItemsCount];
for (long i=0; i<testItemsCount; ++i) {
// make new random key value pair:
NSString *key = [NSString stringWithFormat:@"K_%u",arc4random_uniform(testItemsCount)];
NSNumber *value = @(arc4random_uniform(testItemsCount));
[d setObject:value forKey:key];
}
// create huge set of random keys for testing.
NSMutableArray *keys = [NSMutableArray arrayWithCapacity:testItemsCount];
for (long i=0; i<testItemsCount; ++i) {
NSString *key = [NSString stringWithFormat:@"K_%u",arc4random_uniform(testItemsCount)];
[keys addObject:key];
}
NSDictionary *dict = [d copy];
NSTimeInterval vtotal = 0.0, ototal = 0.0;
NSDate *start;
NSTimeInterval elapsed;
for (int i = 0; i<10; i++) {
start = [NSDate date];
for (NSString *key in keys) {
id value = [dict valueForKey:key];
}
elapsed = [[NSDate date] timeIntervalSinceDate:start];
vtotal+=elapsed;
NSLog (@"reading %lu values off dictionary via valueForKey took: %10.4f seconds", keys.count, elapsed);
start = [NSDate date];
for (NSString *key in keys) {
id obj = [dict objectForKey:key];
}
elapsed = [[NSDate date] timeIntervalSinceDate:start];
ototal+=elapsed;
NSLog (@"reading %lu objects off dictionary via objectForKey took: %10.4f seconds", keys.count, elapsed);
}
NSString *slower = (vtotal > ototal) ? @"valueForKey" : @"objectForKey";
NSString *faster = (vtotal > ototal) ? @"objectForKey" : @"valueForKey";
NSLog (@"%@ takes %3.1f percent longer then %@", slower, 100.0 * ABS(vtotal-ototal) / MAX(ototal,vtotal), faster);
}
언급URL : https://stackoverflow.com/questions/1062183/difference-between-objectforkey-and-valueforkey
'programing' 카테고리의 다른 글
Java 컴파일러 수준이 설치된 Java 프로젝트 패싯의 버전과 일치하지 않습니다. (0) | 2023.04.26 |
---|---|
Windows 배치 파일에서 무한 루프를 만드는 방법은 무엇입니까? (0) | 2023.04.26 |
쉼표로 구분된 문자열을 목록으로 변환하는 방법 (0) | 2023.04.26 |
블록 내부의 변수를 블록 외부의 변수에 할당 (0) | 2023.04.26 |
UITableView 셀 내부의 URL에서 비동기 이미지 로드 - 스크롤하는 동안 이미지가 잘못된 이미지로 변경됨 (0) | 2023.04.26 |