確か Objective-C フレーズブック に載っていた。
知っている限りで一番シンプルな実装方法。
alloc-init や new でのインスタンス化は許容していない。
document.h
#import <Foundation/Foundation.h>
@interface Document : NSObject
+ (Document*)sharedDocument;
@end
document.m
#import "Document.h"
@implementation Document
static Document* _sharedDocument;
+ (void)initialize
{
if ([Document class] == self) {
_sharedDocument = [self new];
}
}
+ (Document*)sharedDocument
{
return _sharedDocument;
}
+ (id)allocWithZone:(NSZone *)zone
{
if (_sharedDocument && [Document class] == self) {
[NSException raise:NSGenericException format:@"May not create more than one instance of Document."];
}
return [super allocWithZone:zone];
}
@end