Objective-C中的单例模式

3

我在一本Objective-C书中看到了一个单例模式的例子。然而,我不知道'单例'定义在Objective-C和其他语言中是否有意义上的区别。[[SingletonClass alloc] init]仍然可以用来创建新对象吗?如果是,如何保证内存中只有一个对象?

#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;
}

可能是重复问题:Objective-C:静态字段和实现单例模式 - Seb T.
5个回答

3
如果您想要一个真正的单例,即只能实例化一次的对象,请查看苹果文档:创建单例实例
基本上,这个想法是覆盖与分配和管理对象相关的许多方法:+allocWithZone(由+alloc调用),-retain,-release,-copyWithZone等,这样就很难创建超过一个单例类的实例。 (仍然可以通过直接调用运行时来创建第二个实例,但这应该足以传达重点。)
几乎每一个写过Objective-C的博主都提出了有关如何实现单例的观点。其中许多意见似乎相当不错,大部分都相当相似。显然Dave DeLong知道他在说什么,而且他关于单例的文章很简短,简单明了。

2
我不知道在Objective-C和其他语言中,“singleton”定义的含义是否有区别。它遵循源自C语言的通用定义。
是的,[[SingletonClass alloc] init]仍然可以用来创建新对象。
如果是的话,如何确保内存中只有一个对象?避免强制模式(例如不要将其强制为单例)。只需创建普通对象。然后,如果您真的只想要一个实例,请创建一个实例并将其保存在某个地方以供重用(您的应用程序委托是一种典型的地方,因为它通常每次执行时只创建一次)。
实际上,我在野外看到的大多数(> 95%)ObjC单例实现都是出于错误的原因使用的,并且作为普通对象会更好或一样好。
到目前为止,答案中链接的每个解决方案都至少存在微妙的问题、风险或不良副作用。

0
在Objective-C中,您可以通过以下方式创建单例:
+(MyAPI *)shared {
    static dispatch_once_t queue;
    static MyAPI *singleton = nil;
 
    dispatch_once(&queue, ^{
        singleton = [[MyAPI alloc] init];
    });

    return singleton;
}

这也将确保它是线程安全的。如果不使用dispatch_once,则存在多个线程尝试在一个正在分配它的过程中同时访问它的风险,而另一个线程则试图使用它。


0

单例模式没有语言支持,但是你可以手动实现。看一下这个单例模式的例子here。不过它似乎不是线程安全的。我建议在+initialize方法中分配对象,而不是在+sharedManager方法中。


-1

单例类用于保存数据以供应用程序的任何地方使用。

//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

保存和检索数据 // 使用单例对象

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接