单 例类是一个非常重要的概念,因为它们表现出了一种十分有用的设计模式,在.net等开发中也会经常遇到。单例类的应用贯穿于整个iPhone SDK中。例如,UIApplication类有一个方法叫sharedApplication,从任何地方调用这个方法,都将返回与当前正在运行的应用 程序相关联的UIApplication实例。
博主补充:单例类保证了应用程序的生命周期中有且仅有一个该类的实例对象,而且易于外界访问。
实现
你可以用以下代码实现一个Objective-C的单例类(ARC模式下):
#import <foundation/Foundation.h>
@interface QHHManager : NSObject {
NSString *someProperty;
}
@property (nonatomic, retain) NSString *someProperty;
+ (id)sharedManager;
@end
#import "QHHManager.h"
@implementation QHHManager
@synthesize someProperty;
+ (id)sharedManager {
static QHHManager *sharedQHHManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedQHHManager = [[self alloc] init];
});
return sharedQHHManager;
}
- (id)init {
if (self = [super init]) {
someProperty = [[NSString alloc] initWithString:@"Default Property Value"];
}
return self;
}
- (void)dealloc {
// 永远不要调用这个方法
}
在这里我们定义了一个静态变量sharedQHHManager,然后仅初始化一次该变量。这里使用了dispatch_once以保证该变量只被GCD初始化一次。操作系统将保证这是线程安全的。
如果不使用GCD,你可以使用以下代码:
+ (id)sharedManager {
static QHHManager * sharedQHHManager = nil;
@synchronized(self) {
if (sharedQHHManager == nil)
sharedQHHManager = [[self alloc] init];
}
return sharedQHHManager;
}
接下来,当你需要使用这个单例对象时,你只要这样调用就可以了:
QHHManager *sharedManager = [sharedQHHManager sharedManager];
snippet_file_0.m
我在我的代码中广泛使用单例类,比如创建一个单例类来处理CoreLocation或CoreData功能。
IOS中的单例模式
原文:http://www.cnblogs.com/qihaohao07/p/4933725.html