これはシングルトンを実装する通常の方法ではなく、の規則を破っていますinit
。sharedInstance
クラスメソッドを作成し、initWithParam
メソッドをより慣習的なものにすることをお勧めします。
static MyObject *_sharedInstance = nil;
+ (MyObject *)sharedInstance:(NSString *)param
{
if (_sharedInstance == nil)
{
_sharedInstance = [MyObject alloc] initWithParam:param];
}
return _sharedInstance;
}
// This must be called during app termination to avoid memory leak
+ (void)cleanup
{
[_sharedInstance release];
_sharedInstance = nil;
}
- (id)initWithParam:(NSString *)param
{
self = [super init];
if (self != nil)
{
self.someProperty = param;
}
return self;
}
ただし、それでもあまり快適ではないようです。sharedInstance
つまり、ユーザーが別のパラメーターで呼び出すとどうなりますか? おそらくNSMutableDictionary
、初期化されたオブジェクトを保持し、パラメータに応じてそれらを作成/返したいですか?
その場合、次のようにします。
static NSMutableDictionary _sharedInstances = [[NSMutableDictionary alloc] init];
+ (MyObject *)sharedInstance:(NSString *)param
{
MyObject *obj = [_sharedInstances objectForKey:param];
if (obj == nil)
{
obj = [[MyObject alloc] initWithParam:param];
[_sharedInstances setObject:obj forKey:param];
}
return obj;
}
// This must be called during app termination to avoid memory leak
+ (void)cleanup
{
[_sharedInstances release];
_sharedInstances = nil;
}