我可以在 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];
我要创建的内容:
我想制作一个具有自身共享实例的 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];