6

あなたの意見では、NSObjectのシングルトンサブクラスが次のようなパラメータで初期化されている場合:

- (MyObject *) initWithSomeParam:(NSString *)param{
    self = [super init];
    if (SharedInstance == nil){
        SharedInstance = [super init];
        SharedInstance.someProperty = param;
    }
    return self;
}

+ (MyObject *) objectWithSomeParam:(NSString *)param{
    return [[self alloc] initWithSomeParam:param];
    // Will the alloc cause a leak?
}

ユーザーはインスタンスメソッドにアクセスできず、クラスのみにアクセスできます。ありがとう。

4

1 に答える 1

3

これはシングルトンを実装する通常の方法ではなく、の規則を破っていますinitsharedInstanceクラスメソッドを作成し、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;
}
于 2012-06-01T11:57:49.200 に答える