2011-08-22 65 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];