我的Objective-C单身人物应该是什么样的?我的单例访问器方法通常是以下的一些变体:static MyClass *gInstance = NULL;+ (MyClass *)instance{
@synchronized(self)
{
if (gInstance == NULL)
gInstance = [[self alloc] init];
}
return(gInstance);}我可以做些什么来改善这个?
3 回答
海绵宝宝撒
TA贡献1809条经验 获得超8个赞
另一种选择是使用该+(void)initialize
方法。从文档:
运行时
initialize
在程序之前恰好一次发送给程序中的每个类,或者从程序中发送它的第一个消息。(因此,如果未使用该类,则永远不会调用该方法。)运行时initialize
以线程安全的方式将消息发送到类。超类在其子类之前接收此消息。
所以你可以做类似于此的事情:
static MySingleton *sharedSingleton;+ (void)initialize{ static BOOL initialized = NO; if(!initialized) { initialized = YES; sharedSingleton = [[MySingleton alloc] init]; }}
偶然的你
TA贡献1841条经验 获得超3个赞
根据我在下面的其他答案,我认为你应该这样做:
+ (id)sharedFoo{ static dispatch_once_t once; static MyFoo *sharedFoo; dispatch_once(&once, ^ { sharedFoo = [[self alloc] init]; }); return sharedFoo;}
大话西游666
TA贡献1817条经验 获得超14个赞
一个线程安全的单例,试图避免锁定成本,我想我也会抛出一个:
#import <libkern/OSAtomic.h>static void * volatile sharedInstance = nil; + (className *) sharedInstance { while (!sharedInstance) { className *temp = [[self alloc] init]; if(!OSAtomicCompareAndSwapPtrBarrier(0x0, temp, &sharedInstance)) { [temp release]; } } return sharedInstance; }
好的,让我解释一下这是如何工作的:
快速情况:在正常执行
sharedInstance
中已经设置好了,所以while
循环永远不会执行,只需测试变量的存在就会返回函数;慢速情况:如果
sharedInstance
不存在,则使用比较和交换('CAS')分配实例并将其复制到其中;争鸣情况:如果两个线程都试图调用
sharedInstance
在同一时间和sharedInstance
同一时间不存在,那么他们都将初始化为CAS是单身主义者和尝试的新实例到位。无论哪一个赢得CAS立即返回,无论哪一个失去释放它刚刚分配的实例并返回(现在设置)sharedInstance
。单个OSAtomicCompareAndSwapPtrBarrier
作为设置线程的写屏障和来自测试线程的读屏障。
添加回答
举报
0/150
提交
取消