iOS单例

ios之单例模式

原帖地址:http://www.galloway.me.uk/tutorials/singleton-classes/

本文为博主自行翻译,转载请注明出处:http://blog.csdn.net/iosevanhuang/article/details/13278323

“单例模式”是我在iOS中最常使用的设计模式之一。单例模式不需要传递任何参数,就有效地解决了不同代码间的数据共享问题。

背景

单例类是一个非常重要的概念,因为它们表现出了一种十分有用的设计模式。单例类的应用贯穿于整个iPhone SDK中。例如,UIApplication类有一个方法叫sharedApplication,从任何地方调用这个方法,都将返回与当前正在运行的应用 程序相关联的UIApplication实例。

博主补充:单例类保证了应用程序的生命周期中有且仅有一个该类的实例对象,而且易于外界访问。

实现

你可以用以下代码实现一个Objective-C的单例类(ARC模式下,非ARC模式下面会讲到):

1
2
3
4
5
6
7
8
9
10
11

#import <foundation/Foundation.h>

@interface MyManager : NSObject {

NSString *someProperty;

}

@property (nonatomic, retain) NSString *someProperty;

+ (id)sharedManager;

@end

MyManager.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

#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 {

// 永远不要调用这个方法

}

@end

MyManager.m

在这里我们定义了一个静态变量sharedMyManager,然后仅初始化一次该变量。这里使用了dispatch_once以保证该变量只被GCD初始化一次。操作系统将保证这是线程安全的。

如果不使用GCD,你可以使用以下代码:

1
2
3
4
5
6
7
8

+ (id)sharedManager {

static MyManager *sharedMyManager = nil;

@synchronized(self) {

if (sharedMyManager == nil)

sharedMyManager = [[self alloc] init];

}

return sharedMyManager;

}

Non-GCD-based-code.m

接下来,当你需要使用这个单例对象时,你只要这样调用就可以了:

1

MyManager *sharedManager = [MyManager sharedManager];

snippet_file_0.m

我在我的代码中广泛使用单例类,比如创建一个单例类来处理CoreLocation或CoreData功能。

非ARC代码

虽然我并不那么推荐,但是如果你要使用非ARC环境的话,你应该使用以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

#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; // 表示该对象永远不应被释放

}

- (oneway void)release {

// 从不释放

}

- (id)autorelease {

return self;

}

- (id)init {

if (self = [super init]) {

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

}

return self;

}

- (void)dealloc {

// 从不调用该方法

[someProperty release];

[super dealloc];

}

@end

MyManager-non-ARC.m

博主:这里的单例都是懒汉式单例,当单例对象的获取方法第一次被调用时创建单例对象。而在类被加载时就创建单例对象叫做饿汉式单例。

时间: 2024-12-17 07:14:05

iOS单例的相关文章

ios单例的实现

单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 这里主要介绍下在arc下,利用gcd实现单例. 第一步:声明一个静态实例 static SoundTool *_instance; 第二步:重写初始化方法 + (id)allocWithZone:(struct _NSZone *)zone 在对象初始化分配内存的时候都会调用这个方法,重写该方法时,即便用户没用通过shared方法获取实例,自己初始化依然可以保证得到的是同一个实例. 在gcd后,多线程下保证一个代码只被执

iOS单例创建的一点疑惑

线程安全的单例常用写法, +(AccountManager *)sharedManager{ static AccountManager *defaultManager = nil; disptch_once_t once; disptch_once(&once,^{ defaultManager = [[self alloc] init]; }); return defaultManager; } 在用的过程中,有点疑惑的点是:static AccountManager *defaultMan

蓝懿 iOS iOS单例销毁

1 单例的实现见之前写过的一篇文章 iOS单例的快速实现 static InstanceClass *instance; + (InstanceClass *)defaultInstance{ @synchronized (self){ if (instance == nil) { instance = [[InstanceClass alloc] init]; } } return instance;} 2 单例的概念复习下 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而

iOS单例宏

先别急,先简单提一下单列的概念,当然具体的描述可能仁者见仁智者见智了! 1.单例设计模式(Singleton) 1> 什么是单列: 它可以保证某个类创建出来的对象永远只有1个 2> 作用(为什么要用) 节省内存开销 如果有一些数据, 整个程序中都用得上, 只需要使用同一份资源(保证大家访问的数据是相同的,一致的) 一般来说, 工具类设计为单例模式比较合适 3> 怎么实现,老程序员是碰到这样的问题的!arc下就少了! MRC(非ARC) ARC 废话少说,先来看一下我的单例模式下的头文件!

iOS 单例

iOS 单例 1.官方文档写法 static AccountManager *DefaultManager = nil; + (AccountManager *)defaultManager { if (!DefaultManager) DefaultManager = [[self allocWithZone:NULL] init]; return DefaultManager; } 2.来自 objcolumnist + (AccountManager *)sharedManager { s

iOS单例写法简析

官方文档这样写的: static AccountManager *DefaultManager = nil; + (AccountManager *)defaultManager { if (!DefaultManager) DefaultManager = [[self allocWithZone:NULL] init]; return DefaultManager; } 在iOS4之后有了另外一种写法: + (AccountManager *)sharedManager { static A

iOS单例的快速实现

单例模式是iOS常用设计模式中的一种.单例设计模式的作用是使得这个类的一个对象成为系统中的唯一实例,因此需要用一种唯一的方法去创建这个对象并返回这个对象的地址.那么,我们何时使用单例模式呢?1.类只能有一个实例,而且必须从一个为人熟知的访问点对其访问.2.这个唯一的实例只能通过子类化进行扩展,而且扩展的对象不会破坏客户端代码. 根据线程安全的实现来区分,一种是使用@synchronized ,另一种是使用GCD的dispatch_once函数. 要实现单例,首先需要一个static的指向类本身的

IOS 单例设计模式解读

IOS 中单例设计模式的解读与用法 一.单例的作用 顾名思义,单例,即是在整个项目中,这个类的对象只能被初始化一次.它的这种特性,可以广泛应用于某些需要全局共享的资源中,比如管理类,引擎类,也可以通过单例来实现传值.UIApplication.NSUserDefaults等都是IOS中的系统单例. 二.单例的写法 单例的写法常用的有两种方式: 方式1.不考虑线程 static SingleCase *manager = nil;       + (SingleCase *)defaultMana

IOS单例的两种实现方式

单例模式算是开发中比较常见的一种模式了.在iOS中,单例有两种实现方式(至少我目前只发现两种). 根据线程安全的实现来区分,一种是使用@synchronized ,另一种是使用GCD的dispatch_once函数. [email protected]synchronized 实现 static InstanceClass *instance; + (InstanceClass *)defaultInstance{ @synchronized (self){ if (instance == ni