2011-08-22 85 views
2

我在objective-c書上看到了一個singleton示例。但是,我不知道在objective-c和其他langs之間是否存在「singleton」定義的不同含義。這個[[SingletonClass alloc] init]仍然可以用來創建一個新的對象嗎?如果是,如何保證內存中只有一個對象?singleton in objective c

#import "SingletonClass.h" 

@implementation SingletonClass 

static SingletonClass *sharedInstance = nil; 

// Get the shared instance and create it if necessary. 
+ (SingletonClass*)sharedInstance { 
    if (sharedInstance == nil) { 
     sharedInstance = [[super allocWithZone:NULL] init]; 
    } 

    return sharedInstance; 
} 

// We can still have a regular init method, that will get called the first time the    Singleton is used. 
- (id)init 
{ 
    self = [super init]; 

    if (self) { 
     // Work your initialising magic here as you normally would 
    } 

    return self; 
} 
+0

可能的複製:[目的-C:靜態字段和執行單例模式](http://stackoverflow.com/questions/6912703/objective-c-static-field-and-implementation-singleton-pattern/6913036#6913036) –

回答

8

Colin Wheeler在Singletons in Cocoa上有帖子。

我同意Colin關於單身人士的不可取之處。

+1

+1良好的鏈接 - Apple的代碼不考慮線程安全。 – Caleb

2

如果你想要一個真正的單例,也就是隻能實例化一次的對象,請看Apple的文檔:Creating a Singleton Instance

基本上,這個想法是重寫一些與分配和管理對象相關的方法:+ allocWithZone(由+ alloc調用),-retain,-release,-copyWithZone等等,以便它變得相當很難創建單個類的多個實例。 (通過直接調用運行時創建第二個實例仍然是可能的,但這應該足以讓您瞭解點。)

幾乎每個曾經以任何身份寫過Objective-C的博客都提供了一個意見關於如何實現單身人士。其中許多意見看起來相當不錯,其中大部分意見都非常相似。很明顯,Dave DeLong知道他在說什麼,而his piece on singletons是短暫的,甜蜜的,並且直接指向了這一點。

0

單身人士沒有語言支持,但可以手動完成。看看單例示例here。不過,它看起來並不像線程安全。我將在+初始化中分配對象,而不是+ sharedManager。

2

我不知道在objective-c和其他langs之間是否存在「singleton」定義的含義不同。

它遵循的語言從C

導出的通用定義可以這樣[[SingletonClass的alloc] INIT]仍然可以用於創建新對象?

如果是,如何保證只有一個在內存中的對象?

避免執行該模式(例如,不要強制它是單身人士)。只是做一個正常的對象。然後,如果您確實只需要一個實例,請創建一個實例並將其保存在某個位置以供重用(您的應用程序委託是此類的一個典型位置,因爲它通常在每次執行時創建一次)。

實際上,我在野外看到的大多數(> 95%)ObjC單例實現都是由於錯誤的原因而使用的,並且會比普通對象更好或更好。

到目前爲止答案中的每個解決方案都有(至少)微妙的問題,危險或不良的副作用。

0

Singleton類用於保存數據以供在應用程序中的任何位置使用。

//SingletonObject 
#define saveDataSingletonObject ((SaveDataSingleton*)[SaveDataSingleton sharedManager]) 

@interface SaveDataSingleton : NSObject 

@property (nonatomic,strong) NSMutableArray *DataArr; 
+ (id)sharedManager; 
-(void)clearAllSaveData; 

@end 

@implementation SaveDataSingleton 
@synthesize DataArr; 
+ (id)sharedManager { 
    static SaveDataSingleton *sharedManager; 
    if(!sharedManager) { 
     @synchronized(sharedManager) { 
      sharedManager = [SaveDataSingleton new]; 
     } 
    } 
    return sharedManager; 
} 
-(void)clearAllSaveData{ 
    DataArr=nil; 
} 
- (id)init { 
    if (self = [super init]) { 
     DataArr = [[NSMutableArray alloc]init]; 
    } 
    return self; 
} 
// using setter getter save and retrieve data 
+(void)setDataArr:(NSMutableArray *)Dataarr 
{ 
    self.DataArr = [[NSMutableArray alloc]initWithArray:Dataarr]; 
} 

+(NSMutableArray *)DataArr 
{ 
    return self.DataArr; 
} 
@end 

保存和檢索數據 //使用Singleton對象

// save data using setter function. 
[saveDataSingletonObject setDataArr:Array]; 
//fetch data using getter function. 
NSArray *arr=[saveDataSingletonObject DataArr];