Objective-C 单例模式

简单说单例模式就是创建一个对象的全局唯一实体。方便管理全局数据。具体单例模式的讲解可以看设计模式相关书籍,这边主要是介绍下现阶段可以如何在Objective-C语言中实现单例模式。

如何实现

苹果加入 GCD 之后我们可以利用 GCD实现。
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 能保证在多线程调用的时候 sharedMyManager 初始化一次。
如果不想使用 GCD来实现,我们可以使用如下 :

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

Non-ARC (非 ARC 模式)

推荐如下实现方式

#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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 单例模式出现以后,关于它的争执就一直存在。在开发项目中,有很多时候我们需要一个全局的对象,而且要保证全局有且仅有一...
    蒲公英少年阅读 8,355评论 0 24
  • 单例对象实现方法: 注解: static Singleton *_instance = nil这里使用静态变量是为...
    Zentopia阅读 695评论 0 1
  • 单例类是一种特殊的类,在操作系统中的一个进程内只会存在一个该类的对象,在iOS应用中同样也只会出现一个对象。这种设...
    戴维营教育阅读 618评论 0 0
  • Swift、Objective-C 单例模式 (Singleton)原文地址:http://www.cnblogs...
    98eb16019912阅读 365评论 0 2
  • 一束小小的光芒,知道自己的使命就是不断地前进,他努力的跑呀跑呀,终点在哪里呢?他经过庞大的星体,穿越了浩瀚的宇宙,...
    尘埃之匣阅读 217评论 0 1