IOS 中的单例模式
2014-09-30 03:36
169 查看
转自 http://www.galloway.me.uk/tutorials/singleton-classes/
One of my most used design patterns when developing for iOS is the singleton pattern. It’s an extremely powerful way to share data between different parts of code without
having to pass the data around manually. More about the singleton pattern and other patterns can be found in this excellent book:
Singleton classes are an important concept to understand because they exhibit an extremely useful design pattern. This idea is used throughout the iPhone SDK, for example, UIApplication has a method called sharedApplication which when called from anywhere will
return the UIApplication instance which relates to the currently running application.
You can implement a singleton class in Objective-C using the following code:
MyManager.h
MyManager.m
What this does is it defines a static variable (but only global to this translation unit)) called
is then initialised once and only once in
The way we ensure that it’s only created once is by using the
from Grand Central Dispatch (GCD). This is thread safe and handled entirely by the OS for you so
that you don’t have to worry about it at all.
However, if you would rather not use GCD then you should use the following code for
Non-GCD based code
Then you can reference the singleton from anywhere by calling the following function:
I’ve used this extensively throughout my code for things such as creating a singleton to handle CoreLocation or CoreData functions.
Not that I recommend it, but if you are not using Automatic Reference Counting (ARC), then you should use the following code:
MyManager.h non-ARC
Singletons in Objective-C
One of my most used design patterns when developing for iOS is the singleton pattern. It’s an extremely powerful way to share data between different parts of code withouthaving to pass the data around manually. More about the singleton pattern and other patterns can be found in this excellent book:
Background
Singleton classes are an important concept to understand because they exhibit an extremely useful design pattern. This idea is used throughout the iPhone SDK, for example, UIApplication has a method called sharedApplication which when called from anywhere willreturn the UIApplication instance which relates to the currently running application.
How to implement
You can implement a singleton class in Objective-C using the following code:MyManager.h
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 |
1 2 3 4 5 6 7 8 9 10 1112 | #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 |
sharedMyManagerwhich
is then initialised once and only once in
sharedManager.
The way we ensure that it’s only created once is by using the
dispatch_oncemethod
from Grand Central Dispatch (GCD). This is thread safe and handled entirely by the OS for you so
that you don’t have to worry about it at all.
However, if you would rather not use GCD then you should use the following code for
sharedManager:
Non-GCD based code
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; } |
MyManager *sharedManager = [MyManager sharedManager];
I’ve used this extensively throughout my code for things such as creating a singleton to handle CoreLocation or CoreData functions.
Non-ARC code
Not that I recommend it, but if you are not using Automatic Reference Counting (ARC), then you should use the following code:MyManager.h non-ARC
1 2 3 4 5 6 7 8 9 10 1112 | #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 |
相关文章推荐
- 使用ROMMON模式下的tftpdnld命令进行IOS的拷贝
- RMON模式下的IOS升级
- ios object-c 实现Singleton(单例)模式
- [IOS 下重温设计模式] - AbstractFactory
- iOS开发中的设计模式 - 委托
- [IOS 下重温设计模式] - Singleton
- IOS开发基础之──单例模式
- 【iOS-Cocos2d游戏开发之八】开启高清(960*640)模式问题与解答、图片适配以及设置iphone横竖屏
- ios单态(singleton)设计模式
- CISCO 4506 rommon模式恢复IOS
- ROMMON模式下的xmodem命令进行IOS的拷贝
- Switch: 模式中上传IOS
- rommon模式下TFTP方法恢复IOS
- IOS 启动模式解析
- PIX525透明模式详细配置过程(含ios升级详细教程)
- CISCO 设备 rommon 模式刷新IOS步骤
- ios线程监听者模式
- iOS开发中的设计模式 - 委托