2013-05-17 17 views
0

類我已經創建了一個單件類在目的C.類似下面:目標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"]; 

添加對象,當我檢查從另一個類的數組的內容,該陣列包括只有兩個被默認情況下初始化的值。我從另一個班加入的價值沒有出現。 可能是什麼問題?我在這裏錯過了什麼嗎?請幫忙。

+1

http://stackoverflow.com/questions/6324732/using-a-singleton-to-create-an-array-accessible-by-multiple-views –

+0

如果可能,請格式化您的代碼。這很難閱讀。謝謝。 –

回答

3

allocWithZone:完全實施。這很容易出錯,而且很明顯很奇怪。實際情況是,如果你的代碼使用你的單例類,並且不通過sharedInstance那麼那個代碼就會被破壞。試圖隱藏這種破碎後會導致疼痛。

只是做這一個:

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

如果您沒有看到更新您的其他類中的數組,然後還有一些其它的錯誤。

-4

我覺得你忘了!在init方法自前:

-(id)init { 

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

這就是爲什麼每次你得到一個新的實例你單身

+0

不要猶豫,爲什麼這是錯的?他的代碼是否正確與這(自己)? – Shamanoid

+1

它只需要一個'!'來使它完全錯誤。 – vikingosegundo

+0

@Shamanoid你能解釋一下爲什麼你認爲它是正確的嗎? – Popeye

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; 
} 
+0

OP的'allocWithZone:'不應該被他的實現調用,因爲它會是一個無限循環.... – bbum