1

init 方法是在 NSObject 类中声明的,因此,客户端代码可以创建我的单例类的新实例,有没有办法实现真正​​的单例,使得客户端无法创建新实例。

4

4 回答 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 回答