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.nameis 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