单身人士的问题

时间:2013-04-01 12:24:57

标签: ios objective-c singleton

我为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 个答案:

答案 0 :(得分:3)

例如,在init方法中使用断言。

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

    assert(maxInstances > 0);

    maxInstances--;

    ...
}

答案 1 :(得分:0)

因为您正在使用allocinit创建单身类的新实例。

您将使用 sharedInstance类方法获取单例实例。赞:

id speaker = [MyClass sharedInstance];

如果您不想使用allocinit创建实例。覆盖这些方法。

您可以将static MyClass *sharedSpeaker = nil;写为静态全局变量,并将其从sharedInstance方法中删除。

答案 2 :(得分:0)

<。>文件中的

    #import <Foundation/Foundation.h>

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

    + (Singleton *)sharedSingleton;
<。>文件中的

    #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

答案 3 :(得分: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]);