Objective-C uses dynamic binding: that is method calls are resolved at runtime.
Fine.
And use of dot notation really boils down to a method call
But, why then, can't I do something like this:
#import <Foundation/Foundation.h> int main (int argc, const char * argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // Intercept the exception @try { @throw [ NSException exceptionWithName:@"Exception named ME!" reason:@"Because i wanted to" userInfo:nil ] ; } @catch( id exc ) // pointer to an exception object? { //NSLog( @"%@ : %@\n", exc.name, exc.reason ) ; // ILLEGAL: Request for member // 'name' in something not a structure or union.. // If objective-c uses dynamic binding, and dot notation // boils down to calling the getter, then // WHY do I have to cast to the concrete type here? // Only works if I cast to the concrete type NSException* NSException* nexc = (NSException*)exc ; NSLog( @"%@ : %@\n", nexc.name, nexc.reason ) ; } [pool drain]; return 0; }
When I hear "dynamic binding" I'm thinking "so it should behave like a scripting language", and I'm surprised how inflexible Objective-C seems compared to a scripting language like JavaScript.
[(id)exc name]
, but you can't do(id)exc.name
is one of the reasons why it's a hack, and a bad, poorly thought out one at that. Providing more than one way to do the same thing is usually a bad idea, and the fact that the two ways aren't symmetric causes lots of problems and confusion. – johne