Objective-C has good aspects like lightweight syntax that extends C, dynamic message sending without inheritance, and true introspection. It allows adding methods to classes through categories and proxies. Key-value coding and binding facilitates runtime binding of object properties. However, it also has drawbacks like verbose syntax with square brackets, lack of language support for non-message sending code, and half-manual memory management without garbage collection. While frameworks like Cocoa mitigate issues, Objective-C trades type safety for runtime features.