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

时间:2015-08-10 00:47:17

标签: objective-c singleton

我想要创建的内容:

我想创建一个拥有自己共享实例的类。当我调用[someClass sharedInstance];时,我想让它返回:自己的共享实例。

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

我知道,在横向上,如果您正在更新更改SceneKit相机节点的欧拉角,则会交换X和Y值。

如果我想创建一堆场景,我必须创建此运动管理器类的许多实例,并将其加载到每个场景中。只需制作一个所述运动管理器的实例,启动它,然后每隔一段时间获取/返回值,就可以避免这种情况。

我的问题是:

我如何编写类方法调用,以便返回类的共享实例?我知道方法调用在类+(instancetype)sharedInstance / .h文件中是.m,但我不知道如何让它返回所述共享实例。

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

编辑注释:显然是重复的问题不是这个问题的重复;这个问题是关于GCD' dispatch_once是否是在iOS 4.0中做到这一点的最佳方式。现在大多数设备都不使用iOS 4.0,而且4.0已经过时了。

1 个答案:

答案 0 :(得分:4)

绝对。这是我一直用于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];