0

我在 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]; 

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

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

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

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

4

3 回答 3

3

完全放弃allocWithZone:实施。它很容易出错,而且是一件非常奇怪的事情。现实情况是,如果您的代码正在使用您的单例类并且没有通过,sharedInstance那么该代码就会被破坏。试图隐藏这种破碎只会在以后引起痛苦。

只需执行此操作:

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

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

于 2013-05-17T14:44:53.157 回答
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;
}
于 2013-05-17T14:13:55.237 回答
-4

我想你忘记了!在 init 方法中的 self 之前:

-(id)init {

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

这就是为什么每次你得到一个新的单例实例

于 2013-05-17T13:52:08.463 回答