Iphone 目标C单身人士班

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

我在Objective C中创建了一个singleton类,如下所示:

@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:
不应该被他的实现调用,因为它是一个无限循环。。。。