我为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>
这看起来像是一种理想的行为。当我在库中向用户提供单例时,如何阻止这种情况。我需要阻止他创建新实例。我是否需要创建静态全局如果我使它全局化他不能创建同名的全局变量将存在冲突权利。那么任何成员都能解决这个问题吗?
答案 0 :(得分:3)
例如,在init
方法中使用断言。
- (id)init {
static int maxInstances = 1;
assert(maxInstances > 0);
maxInstances--;
...
}
答案 1 :(得分:0)
因为您正在使用alloc
,init
创建单身类的新实例。
您将使用 sharedInstance
类方法获取单例实例。赞:
id speaker = [MyClass sharedInstance];
如果您不想使用alloc
或init
创建实例。覆盖这些方法。
您可以将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]);