// // NSObject+IRSharedInstance.m // GlobalSingletonSupportTest // // Created by Evadne Wu on 5/11/11. // Copyright 2011 Iridia Productions. All rights reserved. // #import "NSObject+IRSharedInstance.h" #include #include #include static char kIRSharedInstancePredicate; static char kIRSharedInstanceObject; @implementation NSObject (IRSharedInstance) + (id) irSharedInstance { // uint64_t begin = mach_absolute_time(); __block dispatch_once_t predicate = 0; __block id returned = objc_getAssociatedObject(self, &kIRSharedInstanceObject); if (!returned) @synchronized(self) { returned = objc_getAssociatedObject(self, &kIRSharedInstanceObject); if (!returned) { [(NSValue *)objc_getAssociatedObject(self, &kIRSharedInstancePredicate) getValue:&predicate]; dispatch_once(&predicate, ^ { returned = [[self alloc] init]; objc_setAssociatedObject(self, &kIRSharedInstanceObject, returned, OBJC_ASSOCIATION_ASSIGN); objc_setAssociatedObject(self, &kIRSharedInstancePredicate, [NSValue valueWithBytes:&predicate objCType:@encode(__typeof__(predicate))], OBJC_ASSOCIATION_RETAIN); }); } } // uint64_t end = mach_absolute_time(); // NSLog(@"irSharedInstance instance %@ %x, %i ns", NSStringFromClass([returned class]), returned, (end - begin)); return returned; } @end