絶品ゆどうふのタレ

ふと気づいたことを綴るだけのメモ

継承して使えるSingletonクラス

いや、常々さ。
Singletonて継承できなくてマジしねよーと思ってたんだ。
まぁPHPだと静的束縛だから仕方ないよねーと諦められたんだけど、Objective-Cって動的束縛じゃないですか。


ま、そんなわけで継承して使えるSingletonクラスを作ってみた。

@interface Singleton : NSObject {
}
+ (Singleton *)instance;
@end
@implementation Singleton

static NSMutableDictionary *_instances;

+ (Singleton *)instance {
	@synchronized(self) {
		if ([_instances objectForKey:NSStringFromClass(self)] == nil) {
			[[self alloc] init];
		}
	}
	return [_instances objectForKey:NSStringFromClass(self)];
}

+ (id)allocWithZone:(NSZone *)zone {
	@synchronized(self) {
		if ([_instances objectForKey:NSStringFromClass(self)] == nil) {
			id instance = [super allocWithZone:zone];
			if ([_instances count] == 0) {
				_instances = [[NSMutableDictionary alloc] initWithCapacity:0];
			}
			[_instances setObject:instance forKey:NSStringFromClass(self)];
			return instance;
		}
	}
	return nil;
}

- (id)copyWithZone:(NSZone *)zone {
	return self;
}

- (id)retain {
	return self;
}

- (unsigned)returnCount {
	return UINT_MAX;
}

- (void)release {
}

- (id)autorelease {
	return self;
}

@end

あー、こういうところでネタ消化しちゃうから会社のブログに書くことなくなるんだよな。