programing

objectForKey와 valueForKey의 차이점은 무엇입니까?

closeapi 2023. 4. 26. 23:22
반응형

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'svalueForKey:는 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

반응형