This is GKActorManager.m in view mode; [Download] [Up]
#import <gamekit/gamekit.h> #import <objc/objc-runtime.h> @implementation GKActorManager - init { id ret = [super init]; actorHash = [[HashTable alloc] initKeyDesc:"@" valueDesc:"@" capacity:0]; return ret; } - listOfActorsOfClass:aClass { // get the list of actors for the given class. If no list yet, make one. id list = [actorHash valueForKey:aClass]; if (!list) { list = [[List alloc] init]; [actorHash insertKey:aClass value:list]; } return list; } - addDeadActor:anActor { id list = [self listOfActorsOfClass:[anActor class]]; // I'd use -addObjectIfAbsent: but this is faster. Don't add an object // twice, though, or actors will start behaving _really_ strangely! // (Like jumping around, disappearing, or suddenly "starting over") [list addObject:anActor]; return self; } - getActorOfClass:aClass { // list should NEVER be nil! id list = [actorHash listOfActorsOfClass:aClass]; int count = [list count]; //send message once...cache the result if (!count) return [[aClass alloc] init]; // removing from end is fastest return [list removeObjectAt:(count-1)]; } - getActorOfClassNamed:(char *)className { [self getActorOfClass:objc_lookUpClass(className)]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.