我在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"];
当我从另一个类检查数组内容时,该数组只包含两个默认初始化的值。我从另一个类添加的值没有显示出来。 可能是什么问题呢 ?我在这里错过了什么吗?请帮忙。
答案 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)
-(id)init {
self = [super init];
if(!self) {
instanceArray=[[NSMutableArray alloc]init];
[instanceArray addObject:@"One"];
[instanceArray addObject:@"Two"];
}
return self;
}
这就是为什么每次你得到你的单身人士的新实例