我对在Objective-C中实现单例类的安全方法有疑问。 我的背景主要是在Web开发(PHP)中,但我知道在Obj-C中,事情是完全不同的。例如,我有这个自定义类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
答案 0 :(得分:2)
如gnasher729所述,为了线程安全,您需要使用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;
}
答案 1 :(得分:1)
有关创建单身人士的建议方法,请参阅此链接Create singleton using GCD's dispatch_once in Objective C。
使用gcd,代码变得线程安全。大多数人现在都认为有人将[[Singleton alloc] init]称为一个你不会为其编写代码的错误,因此init方法应该只是初始化对象。