Objective c iOS5中的单身?

Objective c iOS5中的单身?,objective-c,ios5,singleton,Objective C,Ios5,Singleton,您好,我为singleton实现了以前版本的iOS,如下所示: .h文件 @interface CartSingleton : NSObject { } +(CartSingleton *) getSingleton; .m文件 @implementation CartSingleton static CartSingleton *sharedSingleton = nil; +(CartSingleton *) getSingleton { if (sharedSinglet

您好,我为singleton实现了以前版本的iOS,如下所示:

.h文件

@interface CartSingleton : NSObject 
{

}
+(CartSingleton *) getSingleton;
.m文件

@implementation CartSingleton

static CartSingleton *sharedSingleton = nil;

+(CartSingleton *) getSingleton
{
    if (sharedSingleton !=nil)
       {
        NSLog(@"Cart has already been created.....");
        return sharedSingleton;
       }
    @synchronized(self)
   {
    if (sharedSingleton == nil)
       {
        sharedSingleton = [[self alloc]init];
        NSLog(@"Created a new Cart");
       }
   }
    return sharedSingleton;
}
//==============================================================================
+(id)alloc
{
    @synchronized([CartSingleton class])
   {
    NSLog(@"inside alloc");
    NSAssert(sharedSingleton == nil, @"Attempted to allocate a second instance of a singleton.");
    sharedSingleton = [super alloc];
    return sharedSingleton;
   }

    return nil;
}

//==============================================================================
-(id)init
{
    self = [super init];
}
然而,在web上,我看到人们使用以下代码实现了Singleton设计模式:

+ (id)sharedInstance
{
  static dispatch_once_t pred = 0;
  __strong static id _sharedObject = nil;
  dispatch_once(&pred, ^{
    _sharedObject = [[self alloc] init]; // or some other init method
  });
  return _sharedObject;
}
请有经验的人指导我。 我是一个新手,完全搞不清Singleton的旧iOS实现和新iOS实现,哪一个是正确的


非常感谢

dispatch\u once代码段在功能上与其他代码段完全相同。你可以在网站上阅读

这就是我对单身人士的看法:

+ (MySingleton*) getOne {
    static MySingleton* _one = nil;

    @synchronized( self ) {
        if( _one == nil ) {
            _one = [[ MySingleton alloc ] init ];
        }
    }

    return _one;
}

注意:在大多数情况下,您甚至不需要使用@synchronized(但这样做是安全的)。

严格来说,您必须使用:

+ (MySingleton*) instance {
     static dispatch_once_t _singletonPredicate;
     static MySingleton *_singleton = nil;

     dispatch_once(&_singletonPredicate, ^{
        _singleton = [[super allocWithZone:nil] init];
     });

     return _singleton;
 }

 + (id) allocWithZone:(NSZone *)zone {
      return [self instance];
 }
现在您可以保证不能调用alloc/init并创建另一个实例

说明:实例方法位于类级别,是获取单例引用的主要访问方法。该方法只使用dispatch_once()内置队列,该队列只执行一次块。运行时如何保证块只执行一次?使用您提供的谓词(类型为dispatch\u once\t)。这个低级调用将保证即使有多个线程试图调用它,也只有一个线程成功,其他线程等待第一个线程完成后返回


我们重写allocWithZone的原因是alloc调用allocWithZone,将nil作为区域传递(对于默认区域)。为了防止恶意代码分配和初始化另一个实例,我们重写allocWithZone,以便传回的实例是已经初始化的单例。这会阻止创建第二个实例。

单例是一种特殊类型的类,其中当前进程只存在该类的一个实例。(对于iPhone应用程序,一个实例在整个应用程序中共享。)UIKit中的一些示例有[UIApplication sharedApplication](返回应用程序本身的唯一实例)和[NSFileManager defaultManager](返回文件管理器实例)。单件是在整个应用程序中共享数据和常用方法的一种简单方式

您将调用一个将返回singleton对象的类方法,而不是使用alloc/init创建singleton类的实例。您可以为类方法命名任何名称,但通常的做法是将其命名为sharedName或defaultName

请检查一个最佳答案的链接

有关更现代、更简单但仍然是线程安全的代码,请参阅。有人能更详细地解释此代码以改进答案吗?希望解释能有所帮助。否则,请问一个具体的问题来澄清。我认为你不需要allocWithZone——在单一方法中有许多这样的“漏洞”,苹果在WWDC建议只使用第一种方法,忘记所有的模板覆盖来尝试抓住“骗子”。反正是我的回忆,很好的解释。谢谢!如果您不在其他地方使用@syncrhonized,这将为处理ObjectiveC异常带来巨大的开销-因此,如果您不使用它们,则应使用所选答案和块版本。