#include #include #include #include #include @implementation PXObject /* init and lifecycle */ + (instancetype)alloc { return class_createInstance(self, 0); } + (instancetype) new { return [[self alloc] init]; } - (instancetype) retain { return objc_retain_fast_np(self); } - (void) release { objc_release_fast_np(self); } - (instancetype) autorelease { return objc_autorelease(self); } - (instancetype)init { return self; } - (void)dealloc { object_dispose(self); } /* object introspection */ - (Class)class { return object_getClass(self); } - (Class)superclass { return class_getSuperclass([self class]); } - (const char *)className { return class_getName([self class]); } - (BOOL)isKindOfClass:(Class)class { Class current = [self class]; while (current != nil) { if (current == class) return YES; current = class_getSuperclass(current); } return NO; } - (BOOL)isMemberOfClass:(Class)class { return ([self class] == class); } /* selector stuff */ - (BOOL)respondsToSelector:(SEL)selector { return class_respondsToSelector([self class], selector); } #ifdef PARADOX_DEBUG_FEATURES - (void)healthCheck { printf("PXObject health check: %p\n", (void*)self); } + (instancetype)allocDebug { printf("alloc: self = %p\n", (void*)self); printf("alloc: instance size = %zu\n", class_getInstanceSize(self)); printf("alloc: sizeof(Class) = %zu\n", sizeof(Class)); id object = [self alloc]; printf("alloc: object = %p\n", (void*)object); return object; } #endif @end