共享类实例(创建和共享单例)的最佳方法是什么?

时间:2011-09-26 09:13:57

标签: iphone objective-c ios singleton shared

我知道两种方式。什么是更好的?还有什么比两种方式更好的呢?

+ (MyClass *)shared {
    /*
    static MyClass *sharedInstance = nil;

    @synchronized(self) {
        if (sharedInstance == nil) {
            sharedInstance = [[self alloc] init];
        }
    }
    return sharedInstance;
    */

    /*
    static dispatch_once_t pred;
    static MyClass *sharedInstance = nil;

    dispatch_once(&pred, ^{
        sharedInstance = [[self alloc] init];
    });

    return sharedInstance;
    */ 
} 

5 个答案:

答案 0 :(得分:6)

还可以在AppDelegate中创建一个类实例,并在项目的任何位置使用它。

appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

appappDelegate.<yourClassInstance>

答案 1 :(得分:2)

以下是设置共享实例的另一种方法。线程安全性由运行时处理,代码非常简单。这通常是我设置单身人士的方式。如果单例对象使用大量资源但可能未使用,那么dispatch_once方法效果很好。

static MyClass *sharedInstance = nil;

+ (void) initialize 
{
   sharedInstance = [[MyClass alloc] init];
}

+ (MyClass*)sharedInstance   
{
    return sharedInstance;
}

答案 2 :(得分:1)

只需使用dispatch_once版本 - 它可靠且干净。此外,它也适用于ARC - 与上面提出的方法不同。

答案 3 :(得分:1)

这是一些细节

+ (YourClass *)sharedInstance 
{
    // structure used to test whether the block has completed or not
    static dispatch_once_t p = 0;

    // initialize sharedObject as nil (first call only)
    __strong static id _sharedObject = nil;

    // executes a block object once and only once for the lifetime of an application
    dispatch_once(&p, ^{
        _sharedObject = [[self alloc] init];
    });

    // returns the same object each time
    return _sharedObject;
}

答案 4 :(得分:0)