原文: http://www.galloway.me.uk/tutorials/singleton-classes/

在iOS开发中,单例是最有用的设计模式之一。它是在代码间共享数据而不需要手动传递参数的一种最有用的方法。关于单例和其他设计模式,请参考这本书:

《Cocoa design pattern》

背景

单例是一种重要的概念,它是一种极其便利的设计模式。在iPhone SDK中大量使用了单例的概念,例如,UIApplication的sharedApplication方法,任何时候都会返回一个当前应用程序的UIApplication实例。

将如何实现

使用下列代码实现一个单例类:

MyManager.h

#import<foundation/Foundation.h>

@interfaceMyManager : NSObject {

    NSString *someProperty;
} @property(nonatomic, retain) NSString *someProperty; +(id)sharedManager; @end
MyManager.m

#import"MyManager.h"

@implementationMyManager

@synthesizesomeProperty;

#pragmamark 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 justhere for clarity really. } @end

我们定义了一个静态变量叫做sharedMyManager,它在sharedManager方法中只会被实例化一次。通过GCD的dispath_once方法,我们确保sharedMyManager方法只会被创建一次。这是线程安全的,你无需担心什么。

但是,如果你不想用GCD,也可以这样实现sharedManager方法:

//非-GCD 代码

+ (id)sharedManager {

    @synchronized(self) {

       if (sharedMyManager == nil)

           sharedMyManager = [[self alloc] init];
} returnsharedMyManager; }

这样调用单例对象:

MyManager *sharedManager = [MyManager sharedManager];

在我的代码中,很多地方都使用了这样的代码。我用这些单例对象处理CoreLocation或CoreData。

非ARC代码

如果你不使用ARC(不建议),则应该使用下列代码:

MyManager.h  // (非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 anobject that cannot be released

}

- (oneway void)release {

  // never release

}

- (id)autorelease {

  return self;

}

- (id)init {

  if (self = [super init]) {

     someProperty = [[NSString alloc] initWithString:@"Default PropertyValue"];

  }

  return self;

}

- (void)dealloc {

  // Should never be called,but just here for clarity really.

  [someProperty release];

  [super dealloc];

}

@end

OC的单例模式的更多相关文章

  1. OC的单例模式的实现

    下面是在ARC,GCD下的单例模式实现: 头文件里申明类方法getInstance: #import <Foundation/Foundation.h> @interface Single ...

  2. OC 设计模式——单例模式

    单例模式的作用:可以保证在程序运行过程,一个类只有一个实例,而且这个实例易于供外界访问.永远只分配一次内存给这个类.由于在调用alloc方法的时候,都会调用allocWithZone,所以要重写这个方 ...

  3. iOS开发——实用技术OC篇&单例模式的实实现(ACR&MRC)

    单例模式的实实现(ACR&MRC) 在iOS开发中单例模式是一种非常常见的模式,虽然我们自己实现的比较少,但是,系统却提供了不少的到来模式给我们用,比如最常见的UIApplication,No ...

  4. Objective-C单例模式的常用实现

    oc中单例模式可以使用以下方法来实现 + (YourClass *)sharedInstance { static dispatch_once_t once; static YourClass *sh ...

  5. 15分钟弄懂 const 和 #define

    什么是const ? 什么是#define? 他们有什么用? 他们有什么区别? 应该怎么用? 总结 1. 什么是const ? const是C/C++中的一个关键字(修饰符), const一般用来定义 ...

  6. OC 单例模式

    OC 单例模式 概念 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约 ...

  7. OC学习篇之---单例模式

    在之前的一片文章中介绍了对象的拷贝相关知识:http://blog.csdn.net/jiangwei0910410003/article/details/41926531,今天我们来看一下OC中的单 ...

  8. OC编程之道-创建对象之单例模式

    一 何为单例singleton模式?(what) 保证一个类只有一个实例,并提供一个访问它的全局访问点. 二 何时使用单例模式?(where) 1类只能有一个实例,而且必须从一个为人熟知的访问点对其访 ...

  9. OC中使用单例模式

    static Config * instance = nil; +(Config *) Instance { @synchronized(self) { if(nil == instance) { [ ...

随机推荐

  1. Codeforces Round #422 (Div. 2) D. My pretty girl Noora 数学

    D. My pretty girl Noora     In Pavlopolis University where Noora studies it was decided to hold beau ...

  2. Struts2的工作原理(图解)详解

    Struts2的工作原理 上图来源于Struts2官方站点,是Struts 2 的整体结构. 一个请求在Struts2框架中的处理大概分为以下几个步骤(可查看源码:https://github.com ...

  3. 20170223 遇到自建表里面相同key值数据不唯一

     我怎么发现这个表里 key值相同数据不唯一, 这两条看起来是完全相同的, 其实排序不能能合并已经说明问题.

  4. 基于Delphi7 WebService 在Apache发布及Apache使用说明

    基于Delphi7 WebService 在Apache 发布及Apache 使用说明 qq:394251165 前段时间,需要将基于Delphi7 WebService 发布在Apache, 很是苦 ...

  5. 初探linux子系统集之led子系统(三)【转】

    本文转载自:http://blog.csdn.net/eastmoon502136/article/details/37822837 世界杯结束了,德国战车夺得了大力神杯,阿根廷最终还是失败了.也许3 ...

  6. Hadoop学习资料(持续更新)

    Alex的Hadoop菜鸟教程 Hadoop资料合集 Hadoop平台和应用程序框架

  7. 【HDU 1754】 I Hate It

    [题目链接] 点击打开链接 [算法] 树状数组的最值查询 详见这篇文章 : https://blog.csdn.net/u010598215/article/details/48206959 [代码] ...

  8. Linux Cache 机制

    在阅读文章前,您应该具备基本的存储器层次结构知识,至少要了解局部性原理.要详细了解cache基本原理,可以参考本书<深入理解计算机系统>中存储器体系结构一章: 带着疑问来看文章,cache ...

  9. 洛谷P4316绿豆蛙的归宿——期望

    题目:https://www.luogu.org/problemnew/show/P4316 期望水题,从终点向起点推,因为是DAG,所以拓扑序推过去即可. 代码如下: #include<ios ...

  10. "standard,singleTop,singleTask,singleInstance"-Android启动模式

    安卓有4种启动模式,下面我们就进行详细的讲解 用栈的思维去理解,就能理解这些启动模式的本质了 先设置两个页面: A(为测试对象),B两个页面,两个页面都有跳至对方的按钮 一.标准模式(standard ...