1. 程式人生 > >iOS開發之單例模式

iOS開發之單例模式

在設計模式中有一個“單例模式”,表示保證一個類只有一個例項,並提供一個訪問它的全域性訪問點。

就自己的學習和理解,參考各路大神的程式碼,簡單整理了一下單例實現程式碼。

在CocoaFoundamentalsGuide中有一段實現單例模式的示例程式碼。程式碼如下:

/* Singleton.h */
#import <Foundation/Foundation.h>;

@interface Singleton : NSObject
+ (Singleton *)instance;
@end

/* Singleton.m */
#import "Singleton.h"
static
Singleton *instance = nil; @implementation Singleton + (Singleton *)instance { if (!instance) { instance = [[super allocWithZone:NULL] init]; } return instance; } + (id)allocWithZone:(NSZone *)zone { return [self instance]; } - (id)copyWithZone:(NSZone *)zone { return
self; } - (id)init { if (instance) { return instance; } self = [super init]; return self; } - (id)retain { return self; } - (oneway void)release { // Do nothing } - (id)autorelease { return self; } - (NSUInteger)retainCount { return NSUIntegerMax; } @end

這是一種很標準的Singleton實現,中規中矩。不過這種實現並不是執行緒安全的。

參考很多部落格,發現eschaton的部落格中提供一個好用且好理解的單例實現方式,他給出的實現如下:

@interface SomeManager : NSObject
+ (id)sharedManager;
@end

/* 非執行緒安全的實現 */
@implementation SomeManager

+ (id)sharedManager {
    static id sharedManager = nil;

    if (sharedManager == nil) {
        sharedManager = [[self alloc] init];
    }

    return sharedManager;
}
@end

/* 執行緒安全的實現 */
@implementation SomeManager

static id sharedManager = nil;

+ (void)initialize {
    if (self == [SomeManager class]) {
        sharedManager = [[self alloc] init];
    }
}

+ (id)sharedManager {
    return sharedManager;
}
@end