> On Sep 21, 2016, at 4:52 PM, Steve Mills <sjmi...@mac.com> wrote: > >> On Sep 21, 2016, at 18:44, Gabriel Zachmann <z...@tu-clausthal.de> wrote: >> >> I've got a stupid, curious question regarding a code snippet that I have >> found on the net (I tried it, it works). >> >> Here is the code snippet: >> >> - (void) observeValueForKeyPath: (NSString *) keyPath ofObject: (id) object >> change: (NSDictionary *) change context: (void *) >> context >> { >> if ( context == (__bridge void *) @"mediaLibraryLoaded" ) >> { >> // ... >> >> >> My question is: how can the compiler know that '==' in this case is a >> NSString comparison? >> Or is some other magic going on here? if so, which? >> Does the compiler know it should perform some kind of dynamic method >> dispatch? > > My guess, without seeing the code that set up the observer, is that it was > also set up with @"mediaLibraryLoaded", and the compiler collects and reuses > string constants, so the address is the same. I'd guess that if you ensure > that the string is a unique variable, it won't work. > > NSString* s = [NSString stringWithFormat:@"%@%@%@", @"media", @"Library", > @"Loaded"]; > if(context == (__bridge void*)s) > > Steve via iPad
For the above test, you could also try turning off the LLVM code-gen setting "gcc_reuse_strings". (Which parenthetically, you probably wouldn't want to do in shipping code, particularly if you have a lot of strings.) But yeah, as everyone says, it's generally not a good thing to rely upon this behavior, and just use -[NSString isEqual:] Doug Hill _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) 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: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com