To be more precise, you can cast all you like, but all it does is lie to the compiler, which means it can't warn you about the errors in your code. If you have an NSString* you can cast it to NSMutableString* but the object itself remains immutable. Calling any method that would try to modify the string will crash.
You can also for example cast an NSView* to an NSDictionary* if you fancy doing that, but the object is still an NSView and trying to call NSDictionary methods will crash (and calling NSView methods won't work because the compiler won't let you).