• Open Menu Close Menu
  • Apple
  • Shopping Bag
  • Apple
  • Mac
  • iPad
  • iPhone
  • Watch
  • TV
  • Music
  • Support
  • Search apple.com
  • Shopping Bag

Lists

Open Menu Close Menu
  • Terms and Conditions
  • Lists hosted on this site
  • Email the Postmaster
  • Tips for posting to public mailing lists
Re: The joys of people using valueForKey to get objects out of a dictionary.
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: The joys of people using valueForKey to get objects out of a dictionary.


  • Subject: Re: The joys of people using valueForKey to get objects out of a dictionary.
  • From: Greg Parker <email@hidden>
  • Date: Tue, 10 Nov 2015 10:01:24 -0800

> On Nov 10, 2015, at 8:32 AM, Alex Zavatone <email@hidden> wrote:
>
> It's been about 4 or 5 years since I made this mistake but I've just seen a massive swath of code where every access of a dictionary object is using valueForKey instead of objectForKey.
>
> I've got a few examples of why this is a "really bad idea"™, and certainly might explain why lots of that code is wrapped in try/catch blocks.
>
> Am I correct that using valueForKey will raise an exception if the key is missing?
>
> Looking for reasons why I can explain "yeah, I know it works, but here's why it's a terrible idea to use to access a dictionary's objects".

-valueForKey: interprets keys whose name starts with '@' specially. Examples:

[dict valueForKey:@"@allKeys"] returns an array of all keys in the dictionary.

valueForKey: throws an exception if the key name starts with '@' and the name isn't recognized by KVC as special.


% cat test.m
#import <Foundation/Foundation.h>

int main(int argc, char *argv[]) {
    NSDictionary *dict = @{ @"ordinary" : @"ordinary value",
                            @"@allKeys" : @"@allKeys value",
                            @"something" : @"something value",
                            @"@something" : @"@something value" };

    // -objectForKey does the usual thing
    NSLog(@"-- objectForKey --");
    NSLog(@"%@", [dict objectForKey:@"ordinary"]);
    NSLog(@"%@", [dict objectForKey:@"@allKeys"]);
    NSLog(@"%@", [dict objectForKey:@"@something"]);

    // -valueForKey does not
    NSLog(@"-- valueForKey --");
    NSLog(@"%@", [dict valueForKey:@"ordinary"]);
    NSLog(@"%@", [dict valueForKey:@"@allKeys"]);
    NSLog(@"%@", [dict valueForKey:@"@something"]);
}

% clang test.m -framework Foundation && ./a.out
2015-11-10 10:00:55.295 a.out[38293:4747164] -- objectForKey --
2015-11-10 10:00:55.296 a.out[38293:4747164] ordinary value
2015-11-10 10:00:55.296 a.out[38293:4747164] @allKeys value
2015-11-10 10:00:55.296 a.out[38293:4747164] @something value
2015-11-10 10:00:55.296 a.out[38293:4747164] -- valueForKey --
2015-11-10 10:00:55.296 a.out[38293:4747164] ordinary value
2015-11-10 10:00:55.297 a.out[38293:4747164] (
    something,
    ordinary,
    "@allKeys",
    "@something"
)
2015-11-10 10:00:55.298 a.out[38293:4747164] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSDictionaryI 0x7fc0b850ead0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key something.'


--
Greg Parker     email@hidden     Runtime Wrangler



_______________________________________________

Cocoa-dev mailing list (email@hidden)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:

This email sent to email@hidden


References: 
 >The joys of people using valueForKey to get objects out of a dictionary. (From: Alex Zavatone <email@hidden>)

  • Prev by Date: Re: The joys of people using valueForKey to get objects out of a dictionary.
  • Next by Date: Re: The joys of people using valueForKey to get objects out of a dictionary.
  • Previous by thread: Re: The joys of people using valueForKey to get objects out of a dictionary.
  • Next by thread: Re: The joys of people using valueForKey to get objects out of a dictionary.
  • Index(es):
    • Date
    • Thread