Iphone 目标C单身人士班
我在Objective C中创建了一个singleton类,如下所示:Iphone 目标C单身人士班,iphone,objective-c,singleton,Iphone,Objective C,Singleton,我在Objective C中创建了一个singleton类,如下所示: @interface SingletonClass : NSObject{ NSMutableArray *instanceArray; } @property(nonatomic,retain)NSMutableArray *instanceArray; +(SingletonClass*)sharedInstance; @end @implementation SingletonClass @synthe
@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"];
当我检查另一个类中的数组内容时,该数组只包含两个默认初始化的值。我从另一门课上增加的价值没有显现出来。
有什么问题吗?我是不是遗漏了什么?请帮帮我。我想你忘了!在初始化方法中的self之前:
-(id)init {
self = [super init];
if(!self) {
instanceArray=[[NSMutableArray alloc]init];
[instanceArray addObject:@"One"];
[instanceArray addObject:@"Two"];
}
return self;
}
这就是为什么每次你得到一个新的单例实例时,你的
allocWithZone:
的实现都不会被调用,因为你调用的是[super allocWithZone:
,我也不认为你需要这个方法。
我将用以下内容更改您的类方法:
+(instancetype)sharedInstance
{
if(sharedInstance==nil){
sharedInstance = [[SingletonClass alloc]init];
}
return sharedInstance;
}
如果您想更安全,不想创建对象的另一个实例,请使用dispatch\u once
:
+(instancetype)sharedInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[SingletonClass alloc] init];
}
return sharedInstance;
}
完全删除
allocWithZone:
实现。这很容易出错,而且是一件非常奇怪的事情。实际情况是,如果您的代码正在使用singleton类,而没有通过sharedInstance
,那么该代码就被破坏了。试图掩盖这种破碎只会在以后引起痛苦
就这么做吧:
+(instancetype)sharedInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[SingletonClass alloc] init];
});
return sharedInstance;
}
如果在另一个类中没有看到对数组的更新,则存在其他一些bug 如果可能,格式化代码。这很难读。谢谢。请毫不犹豫地告诉我为什么这是错误的?他的代码对这个(自我)正确吗?只需
使其完全错误。@Shamanoid您能解释一下为什么您认为它是对的吗?输入您的代码,在您的应用程序关键类中更改和init
方法,以使用if(!self){…initialize…}
并查看发生了什么!Okkkk我明白了,我为在超级init之前和在init成员之前的代码@Popeye…if(!self)
表示歉意。我说的对吗?OP的allocWithZone:
不应该被他的实现调用,因为它是一个无限循环。。。。