Objective-C 單例模式

簡單說單例模式就是創(chuàng)建一個(gè)對(duì)象的全局唯一實(shí)體。方便管理全局?jǐn)?shù)據(jù)。具體單例模式的講解可以看設(shè)計(jì)模式相關(guān)書籍,這邊主要是介紹下現(xiàn)階段可以如何在Objective-C語言中實(shí)現(xiàn)單例模式。

如何實(shí)現(xiàn)

蘋果加入 GCD 之后我們可以利用 GCD實(shí)現(xiàn)。
MyManager.h
#import <foundation/Foundation.h>

@interface MyManager : NSObject {
    NSString *someProperty;
}

@property (nonatomic, retain) NSString *someProperty;

+ (id)sharedManager;

@end

MyManager.m

#import "MyManager.h"

@implementation MyManager

@synthesize someProperty;

#pragma mark Singleton Methods

+ (id)sharedManager {
    static MyManager *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedMyManager = [[self alloc] init];
    });
    return sharedMyManager;
}

- (id)init {
  if (self = [super init]) {
      someProperty = [[NSString alloc] initWithString:@"Default Property Value"];
  }
  return self;
}

- (void)dealloc {
  // Should never be called, but just here for clarity really.
}

@end

GCD 的 dispatch_once 能保證在多線程調(diào)用的時(shí)候 sharedMyManager 初始化一次。
如果不想使用 GCD來實(shí)現(xiàn),我們可以使用如下 :

+ (id)sharedManager {
    static MyManager *sharedMyManager = nil;
    @synchronized(self) {
        if (sharedMyManager == nil)
            sharedMyManager = [[self alloc] init];
    }
    return sharedMyManager;
}

Non-ARC (非 ARC 模式)

推薦如下實(shí)現(xiàn)方式

#import "MyManager.h"

static MyManager *sharedMyManager = nil;

@implementation MyManager

@synthesize someProperty;

#pragma mark Singleton Methods
+ (id)sharedManager {
  @synchronized(self) {
      if(sharedMyManager == nil)
          sharedMyManager = [[super allocWithZone:NULL] init];
  }
  return sharedMyManager;
}
+ (id)allocWithZone:(NSZone *)zone {
  return [[self sharedManager] retain];
}
- (id)copyWithZone:(NSZone *)zone {
  return self;
}
- (id)retain {
  return self;
}
- (unsigned)retainCount {
  return UINT_MAX; //denotes an object that cannot be released
}
- (oneway void)release {
  // never release
}
- (id)autorelease {
  return self;
}
- (id)init {
  if (self = [super init]) {
      someProperty = [[NSString alloc] initWithString:@"Default Property Value"];
  }
  return self;
}
- (void)dealloc {
  // Should never be called, but just here for clarity really.
  [someProperty release];
  [super dealloc];
}

@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 單例模式出現(xiàn)以后,關(guān)于它的爭執(zhí)就一直存在。在開發(fā)項(xiàng)目中,有很多時(shí)候我們需要一個(gè)全局的對(duì)象,而且要保證全局有且僅有一...
    蒲公英少年帶我飛閱讀 8,468評(píng)論 0 25
  • 單例對(duì)象實(shí)現(xiàn)方法: 注解: static Singleton *_instance = nil這里使用靜態(tài)變量是為...
    Zentopia閱讀 752評(píng)論 0 1
  • 單例類是一種特殊的類,在操作系統(tǒng)中的一個(gè)進(jìn)程內(nèi)只會(huì)存在一個(gè)該類的對(duì)象,在iOS應(yīng)用中同樣也只會(huì)出現(xiàn)一個(gè)對(duì)象。這種設(shè)...
    戴維營教育閱讀 645評(píng)論 0 0
  • Swift、Objective-C 單例模式 (Singleton)原文地址:http://www.cnblogs...
    98eb16019912閱讀 409評(píng)論 0 2
  • 一束小小的光芒,知道自己的使命就是不斷地前進(jìn),他努力的跑呀跑呀,終點(diǎn)在哪里呢?他經(jīng)過龐大的星體,穿越了浩瀚的宇宙,...
    塵埃之匣閱讀 246評(píng)論 0 1

友情鏈接更多精彩內(nèi)容