单例中的 Init 方法 Class (Objective-C)
Init Method in Singleton Class (Objective-C)
我有一个关于在 Objective-C 中实现单例 class 的安全方法的问题。
我的背景主要是网络开发 (PHP),但我知道在 Obj-C 中情况大不相同。例如我有这个自定义 class MyClass 我想成为单身人士:
static MyClass *sharedInstance = nil;
@interface MyClass:NSObject
NSMutableArray *someArray;
@end
@implementation MyClass:NSObject
-(id)init
{
if(sharedInstance) {
self = sharedInstance;
} else if((self=[super init])) {
sharedInstance = self;
someArray = [[NSMutableArray alloc]initWithCapacity:10];
}
return self;
}
+(MyClass *)sharedObject
{
if(!sharedInstance) {
sharedInstance = [[MyClass alloc]init];
}
return sharedInstance;
}
@end
- 这个实现没问题吗?
- 由于在 Obj-C 中我不能将构造函数设为私有(据我所知,也许我错了),这样创建 init 方法可以吗?
请参阅此 link Create singleton using GCD's dispatch_once in Objective C 以了解创建单例的推荐方法。
使用 gcd,代码变得线程安全。大多数人现在认为有人调用 [[Singleton alloc] init] 的情况是您不会为其编写代码的错误,因此 init 方法应该只初始化对象。
如所述,为了线程安全,您需要使用dispatch_once_t
。
+(MyClass *)sharedObject
{
static MyClass *sharedObject = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedObject = [[self alloc] init];
sharedObject.someArray [[NSMutableArray alloc] initWithCapacity:10];
});
return sharedObject;
}
我有一个关于在 Objective-C 中实现单例 class 的安全方法的问题。 我的背景主要是网络开发 (PHP),但我知道在 Obj-C 中情况大不相同。例如我有这个自定义 class MyClass 我想成为单身人士:
static MyClass *sharedInstance = nil;
@interface MyClass:NSObject
NSMutableArray *someArray;
@end
@implementation MyClass:NSObject
-(id)init
{
if(sharedInstance) {
self = sharedInstance;
} else if((self=[super init])) {
sharedInstance = self;
someArray = [[NSMutableArray alloc]initWithCapacity:10];
}
return self;
}
+(MyClass *)sharedObject
{
if(!sharedInstance) {
sharedInstance = [[MyClass alloc]init];
}
return sharedInstance;
}
@end
- 这个实现没问题吗?
- 由于在 Obj-C 中我不能将构造函数设为私有(据我所知,也许我错了),这样创建 init 方法可以吗?
请参阅此 link Create singleton using GCD's dispatch_once in Objective C 以了解创建单例的推荐方法。
使用 gcd,代码变得线程安全。大多数人现在认为有人调用 [[Singleton alloc] init] 的情况是您不会为其编写代码的错误,因此 init 方法应该只初始化对象。
如dispatch_once_t
。
+(MyClass *)sharedObject
{
static MyClass *sharedObject = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedObject = [[self alloc] init];
sharedObject.someArray [[NSMutableArray alloc] initWithCapacity:10];
});
return sharedObject;
}