我知道两种方式。什么是更好的?还有什么比两种方式更好的呢?
+ (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;
*/
}
答案 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)