Objective C Singleton类

时间:2013-05-17 13:27:37

标签: iphone objective-c singleton

我在Objective C中创建了一个单例类。如下所示:

@interface SingletonClass : NSObject{
   NSMutableArray *instanceArray;

}

@property(nonatomic,retain)NSMutableArray *instanceArray;

+(SingletonClass*)sharedInstance;

@end

@implementation SingletonClass
@synthesize instanceArray;

static SingletonClass *sharedInstance =nil;

+(SingletonClass*)sharedInstance
{
    if(sharedInstance==nil){
        sharedInstance=[[super allocWithZone:NULL]init];
    }
    return sharedInstance;
}


-(id)init{
    self=[super init];
    if(self){
        instanceArray=[[NSMutableArray alloc]init];
        [instanceArray addObject:@"One"];
        [instanceArray addObject:@"Two"];
    }
    return  self;
}

+(id)allocWithZone:(NSZone *)zone{   
    return [self sharedInstance];
}

@end

我知道可以使用以下代码从任何地方访问它:

    SingletonClass *singletonObject=[SingletonClass sharedInstance]; 

可以通过singletonObject.instanceArray在任何地方访问instanceArray。

现在我的问题是,是否可以通过向其添加新对象来修改数组?这会坚持下去吗?因为我试图从一个类添加一个对象

    [singletonObject.instanceArray addObject:@"Three"];

当我从另一个类检查数组内容时,该数组只包含两个默认初始化的值。我从另一个类添加的值没有显示出来。 可能是什么问题呢 ?我在这里错过了什么吗?请帮忙。

3 个答案:

答案 0 :(得分:3)

完全放弃allocWithZone:实施。它很容易出错,而且很奇怪。实际情况是,如果您的代码使用的是单例类而没有通过sharedInstance ,那么该代码就会被破坏。试图掩盖这种破碎只会在以后造成痛苦。

做这个:

+(instancetype)sharedInstance
{
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    sharedInstance = [[SingletonClass alloc] init];
  });
  return sharedInstance;
}

如果您没有在其他类中看到该阵列的更新,那么还有其他一些错误。

答案 1 :(得分:1)

您的allocWithZone:实现从未被调用,因为您正在调用[super allocWithZone:],我也认为您不需要这种方法。 我会改变你的类方法:

+(instancetype)sharedInstance
{
    if(sharedInstance==nil){
        sharedInstance = [[SingletonClass alloc]init];
    }
    return sharedInstance;
}

如果您想要更安全,不打算创建对象的另一个实例,请使用dispatch_once

+(instancetype)sharedInstance
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[SingletonClass alloc] init];
    }
    return sharedInstance;
}

答案 2 :(得分:-4)

我认为你忘记了!在init方法之前的自我:

-(id)init {

    self = [super init];
    if(!self) {
        instanceArray=[[NSMutableArray alloc]init];
        [instanceArray addObject:@"One"];
        [instanceArray addObject:@"Two"];
    }
    return  self;
}

这就是为什么每次你得到你的单身人士的新实例