-1

このような 1 トンを ARC 用に作成しました。

+ (MyClass *)sharedInstance {
    static MyClass *sharedSpeaker = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedSpeaker = [[self alloc] init];
    });
    return sharedSpeaker;
}

- (id)init {
    if (self = [super init]) {

    }
    return self;
}

しかし、ここでは次のようなインスタンスを作成しています:

id speaker3 = [[MyClass alloc] init];
id speaker = [MyClass sharedInstance];
id speaker2 = [[MyClass alloc] init];
NSLog(@"Speaker 1= %@ \n speaker 2 = %@\n Speaker3 = %@",speaker,speaker2,speaker3);`

次のように出力されました:

Speaker 1= <MyClass : 0xa45f5e0> 
speaker 2 = <MyClass : 0xa461740>
Speaker3 = <MyClass : 0xa4529e0>

これは望ましい動作のように見えます。ライブラリ内のシングルトンをユーザーに提供しているときにこれを停止する方法。彼が新しいインスタンスを作成するのをブロックする必要があります。グローバルにする場合、静的グローバルにする必要がありますか?彼は同じ名前のグローバル変数を作成できず、競合が発生します。それで、どのメンバーもこれについて解決策を提供できますか?

4

4 に答える 4

3

たとえば、initメソッドで assert を使用します。

- (id)init {
    static int maxInstances = 1;

    assert(maxInstances > 0);

    maxInstances--;

    ...
}
于 2013-04-01T12:34:36.913 に答える
0

allocを使用してシングルトン クラスの新しいインスタンスを作成しているためですinit

sharedInstanceクラス メソッドを使用してシングルトン インスタンスを取得します。お気に入り:

id speaker = [MyClass sharedInstance];

allocまたはでインスタンスを作成したくない場合init。これらのメソッドをオーバーライドします。

static MyClass *sharedSpeaker = nil;静的グローバル変数として記述し、sharedInstanceメソッドから削除できます。

于 2013-04-01T12:31:27.680 に答える
0
create instance like this it will always return you singlton

static testSinglton *myinstance = nil;
+ (testSinglton *) sharedInstance {
    if (!myinstance) {
        myinstance = [[testSinglton alloc] init];
    }
    return myinstance;
}

- (id) init {

    if (myinstance) {
        return myinstance;
    }
    if (self = [super init]) {
        //new object now will be created...
        myinstance = self;
    }
    return self;
}

 NSLog(@"%@",[[testSinglton alloc] init]);
 NSLog(@"%@",[testSinglton sharedInstance]);
 NSLog(@"%@",[[testSinglton alloc] init]);
于 2013-04-01T14:15:47.597 に答える
0

.h ファイル内

    #import <Foundation/Foundation.h>

    @interface Singleton : NSObject 
    {
            ///......
    }

    + (Singleton *)sharedSingleton;

.m ファイルで

    #import "Singleton.h"

    @implementation Singleton
    static Singleton *singletonObj = NULL;

    + (Singleton *)sharedSingleton 
    {
            @synchronized(self) 
            {
                    if (singletonObj == NULL)
                            singletonObj = [[self alloc] init];
            }
            return(singletonObj);
    }

これを別のファイルで使用します

    #import "Singleton.h"
    //.....

    Singleton *sinObj =  [Singleton sharedSingleton];   // not alloc and init. use direct
于 2013-04-01T12:56:08.147 に答える