Diferença entre objectForKey e valueForKey?

Qual é a diferença entre objectForKey e valueForKey ? Eu olhei tanto na documentação e eles pareciam o mesmo para mim.

objectForKey: é um método NSDictionary . Um NSDictionary é uma class de coleção semelhante a um NSArray , exceto que em vez de usar índices, ele usa chaves para diferenciar entre itens. Uma chave é uma string arbitrária que você fornece. Nenhum object pode ter a mesma chave (assim como nenhum object em um NSArray pode ter o mesmo índice).

valueForKey: é um método KVC. Funciona com QUALQUER class. valueForKey: permite acessar uma propriedade usando uma string para seu nome. Por exemplo, se eu tiver uma class Account com uma propriedade accountNumber , posso fazer o seguinte:

 NSNumber *anAccountNumber = [NSNumber numberWithInt:12345]; Account *newAccount = [[Account alloc] init]; [newAccount setAccountNumber:anAccountNUmber]; NSNumber *anotherAccountNumber = [newAccount accountNumber]; 

Usando o KVC, posso acessar a propriedade dinamicamente:

 NSNumber *anAccountNumber = [NSNumber numberWithInt:12345]; Account *newAccount = [[Account alloc] init]; [newAccount setValue:anAccountNumber forKey:@"accountNumber"]; NSNumber *anotherAccountNumber = [newAccount valueForKey:@"accountNumber"]; 

Esses são conjuntos equivalentes de declarações.

Eu sei que você está pensando: uau, mas sarcasticamente. O KVC não parece tão útil assim. Na verdade, parece “wordy”. Mas quando você quer mudar as coisas em tempo de execução, você pode fazer muitas coisas legais que são muito mais difíceis em outras linguagens (mas isso está além do escopo da sua pergunta).

Se você quiser saber mais sobre o KVC, há muitos tutoriais se você for o Google, especialmente no blog de Scott Stevenson . Você também pode verificar a referência do protocolo NSKeyValueCoding .

Espero que ajude.

Quando você faz valueForKey: você precisa dar a ele uma NSString, enquanto objectForKey: pode pegar qualquer subclass NSObject como uma chave. Isso ocorre porque, para codificação de valor-chave, as chaves são sempre seqüências de caracteres.

Na verdade, a documentação afirma que, mesmo quando você der valueForKey: um NSString, ele invocará objectForKey: qualquer maneira, a menos que a cadeia inicie com um @ , caso em que invoca [super valueForKey:] , que pode chamar valueForUndefinedKey: exceção.

Aqui está um ótimo motivo para usar objectForKey: sempre que possível, em vez de valueForKey:valueForKey: com uma chave desconhecida lançará NSUnknownKeyException dizendo “esta class não é compatível com codificação de chave de valor para a chave”.

Como dito, o objectForKey: datatype é :(id)aKey enquanto o tipo de dados valueForKey: é :(NSString *)key .

Por exemplo:

  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. 

Então, valueForKey: terá apenas um valor de string e é um método KVC, enquanto objectForKey: terá qualquer tipo de object.

O valor em objectForKey será acessado pelo mesmo tipo de object.