原文: 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. 使用iconv的包装类CharsetConverter进行编码转换的示例

    GitHub地址https://github.com/BuYishi/charset_converter_test charset_converter_test.cpp #include <io ...

  2. spring中PropertyPlaceholderHelper替换占位符的值

    1.Properties中的值替换¥{}或者#{}占位符 String text = "foo=${foo},bar=${bar}"; Properties props = new ...

  3. js Date.parse()兼容性问题

    最近在做一个日历控件,网上copy了一段代码然后自己又改改. 标准浏览器下正常,结果ie全部不支持,搞不懂,原来Date.parse在IE下有兼容性问题 //beginData格式为'yyyy-mm- ...

  4. ES6 一些新特性的总结

    一.箭头函数 ES6中新增了一个箭头函数   ()=>,箭头函数通俗点讲就是匿名函数.箭头函数还有不同点在于改变函数中this,和js中的.bind  的方法差不多,继承后指向的不是最新的函数, ...

  5. Collections工具类、Map集合、HashMap、Hashtable(十八)

    1.Map集合概述和特点 * A:Map接口概述 * 去重复, * 查看API可以知道, * 将键映射到值的对象, * 一个映射不能包含重复的键, * 每个键最多只能映射到一个值.* B:Map接口和 ...

  6. MySQL数据库设计常犯的错以及对性能的影响

    1.过分的反范式化为表建立太多的列 我们在设计数据库的结构时,比较容易犯的第一个错误就是对表进行了过分的反范式化的设计,这就容易造成了表中的列过多,虽然说Mysql允许为一个表建立很多的列,但是由于M ...

  7. 【Java】DateUtil(2)

    import java.sql.Timestamp; import java.text.ParseException; import java.text.SimpleDateFormat; impor ...

  8. 不用打开Eclipse就可以执行的命令

    1.android 弹出Android SDK and AVD Manager2.android list avds 列出所有创建的Android模拟器3.android list targets 列 ...

  9. [Selenium] Selenium WebDriver 的下载和安装

    为配合较为广泛使用Java 语言的程序员,仅以WebDriver 的Java语言绑定进行讲解. 步骤1:下载并安装Java开发环境 1)在系统中安装JDK(Java开发工具吧,Java Develop ...

  10. 【AHOI2009】中国象棋

    [题目链接] 点击打开链接 [算法] 动态规划 f[i][j][k]表示前i行,有j列放了1个,有k列放了两个 分六种情况讨论即可 [代码] #include<bits/stdc++.h> ...