init 方法是在 NSObject 类中声明的,因此,客户端代码可以创建我的单例类的新实例,有没有办法实现真正的单例,使得客户端无法创建新实例。
问问题
168 次
4 回答
1
只需这样做:
static SingletonClass *singleton;
+ (SingletonClass *)sharedInstance
{
@synchronized(self) { //For thread safety
if (singleton == nil) {
[[self alloc] init];
}
return singleton;
}
}
-(id)init
{
if (singleton) { //This way init will always return the same instance
return singleton;
}
self = [super init];
if (self) {
singleton = self;
}
return singleton;
}
于 2012-10-19T17:38:22.400 回答
0
这是在目标 c 中做单例的正确方法
+ (id)sharedManager
{
static dispatch_once_t onceQueue;
static SingletonObjectClass *singleton = nil;
dispatch_once(&onceQueue, ^{
singleton = [[self alloc] init];
});
return singleton;
}
- (id)init {
self = [super init];
if (self) {
//.....
}
return self;
}
于 2012-10-19T18:10:50.837 回答
-1
init 方法用于实例变量的初始化。本身不会创建对象。需要重写 alloc、copy 方法才能实现真正的单吨。
希望这应该澄清。
+ (id)alloc {
NSLog(@"%@: use +sharedInstance instead of +alloc", [[self class] name]);
return nil;
}
+ (id)new {
return [self alloc];
}
+ (SingletonClass *)sharedInstance {
static SingletonClass *myInstance = nil;
if (!myInstance)
{
myInstance = [[super alloc] init];
}
return myInstance;
}
于 2012-10-19T13:03:53.447 回答
-1
您可以每次返回该类的静态对象,使其成为单例。
@implementation Singleton
@synthesize testVar;
+ (Singleton*) sharedObject {
static Singleton * myInstance = nil;
if (myInstance == nil) {
myInstance = [[[self class] alloc] init];
testVar = 5;
// Set default values if needed
return myInstance;
}
访问对象及其成员:
[[Singleton sharedObject] testVar]
于 2012-10-19T13:04:14.267 回答