我可以在 Objective-C 中创建单实例 类 吗?

Can I make single-instance classes in Objective-C?

我要创建的内容:

我想制作一个具有自身共享实例的 class。当我调用 [someClass sharedInstance]; 时,我只想拥有它 return:它自己的一个共享实例。

原因是这样的:我想在我的应用程序中有一个 class 可以处理一堆我需要调用很多次或获取值的方法。例如,我想要一个 class 可以使用来自数据陀螺仪的 CoreMotion 访问运动数据,并且可以在任何方向上正确读取它。

我知道,在风景中,如果您进行更新更改 SceneKit 相机节点的欧拉角,则 X 和 Y 值会交换。

如果我想制作一堆场景,我必须创建此运动管理器的许多实例 class,并在每个场景中加载它。这可以通过只制作一个所述运动管理器的实例,启动它,然后每隔一段时间 getting/returning 值来避免。


我的问题是:

我将如何编写 class 方法调用的代码,以便 return class 的共享实例?我知道方法调用将是 class 的 .h/.m 文件中的 +(instancetype)sharedInstance,但我不知道如何将其调用到 return说共享实例。

此外,我将如何初始化共享实例?


编辑说明:显然是重复的问题不是该问题的重复;这个问题是关于 GCD 的 dispatch_once 是否是 iOS 4.0 中最好的实现方式。现在大多数设备都不使用 iOS 4.0,而且 4.0 已经过时了。

当然。这是我一直使用的单例模式 objective-c

+ (instancetype)sharedManager {
    static MyManager *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedMyManager = [[self alloc] init];
    });
    return sharedMyManager;
}

这里有一个,如果你希望你的单例是可实现的,并且将打开已实现的实例(如果存在的话):

+ (instancetype)sharedManager {
    static MyManager *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        NSArray *archivePathHeader = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *archivePathToDocuments = [archivePathHeader objectAtIndex:0];
        NSString *filePathOfArchive = [archivePathToDocuments stringByAppendingPathComponent:@"[FILE NAME]"];
        if ([[NSFileManager defaultManager] fileExistsAtPath:filePathOfArchive]) {
            sharedMyManager = [NSKeyedUnarchiver unarchiveObjectWithFile:filePathOfArchive];
        } else {
            sharedMyManager = [[self alloc] init];
        }
    });
    return sharedMyManager;
}

这两个都使用 GCD。

你可以这样称呼他们:

sharedSettings = [Settings sharedSettings];