为了账号安全,请及时绑定邮箱和手机立即绑定

我的Objective-C单身人物应该是什么样的?

我的Objective-C单身人物应该是什么样的?

我的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];
    }}


查看完整回答
反对 回复 2019-05-27
?
偶然的你

TA贡献1841条经验 获得超3个赞

根据我在下面的其他答案,我认为你应该这样做:

+ (id)sharedFoo{
    static dispatch_once_t once;
    static MyFoo *sharedFoo;
    dispatch_once(&once, ^ { sharedFoo = [[self alloc] init]; });
    return sharedFoo;}


查看完整回答
反对 回复 2019-05-27
?
大话西游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;                                                                        }

好的,让我解释一下这是如何工作的:

  1. 快速情况:在正常执行sharedInstance中已经设置好了,所以while循环永远不会执行,只需测试变量的存在就会返回函数;

  2. 慢速情况:如果sharedInstance不存在,则使用比较和交换('CAS')分配实例并将其复制到其中;

  3. 争鸣情况:如果两个线程都试图调用sharedInstance在同一时间 sharedInstance同一时间不存在,那么他们都将初始化为CAS是单身主义者和尝试的新实例到位。无论哪一个赢得CAS立即返回,无论哪一个失去释放它刚刚分配的实例并返回(现在设置)sharedInstance。单个OSAtomicCompareAndSwapPtrBarrier作为设置线程的写屏障和来自测试线程的读屏障。


查看完整回答
反对 回复 2019-05-27
  • 3 回答
  • 0 关注
  • 689 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信