iOS 单例模式

Posted 张玉宝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS 单例模式相关的知识,希望对你有一定的参考价值。

 

单例模式”是我在ios中最常使用的设计模式之一。单例模式不需要传递任何参数,就有效地解决了不同代码间的数据共享问题。单例类是一个非常重要的概念,因为它们表现出了一种十分有用的设计模式。单例类的应用贯穿于整个iOS的SDK中。例如,UIApplication类有一个方法叫sharedApplication,从任何地方调用这个方法,都将返回与当前正在运行的应用程序相关联的UIApplication实例。除了这个,NSNotificationCenter(消息中心) 、NSFileManager(文件管理) 、 NSUserDefaults(应用程序设置) 、NSURLCache(请求缓存)、NSHTTPCookieStorage(应用程序cookies池)都是系统单例;单例类保证了应用程序的生命周期中有且仅有一个该类的实例对象,而且易于外界访问。

单例模式的要点:

  一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

单例模式的优点:

  1.实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例。
  2.灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程
IOS中的单例模式:
  在objective-c中要实现一个单例类,至少需要做以下四个步骤:
  1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
  2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
  3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
  4、适当实现copyWithZone,release和autorelease。
单例模式的实现:

代码示例:

MySingletonClass.h

复制代码
#import <Foundation/Foundation.h>

@interface MySingletonClass : NSObject
//单例方法
+(MySingletonClass *)sharedInstance; @end
复制代码

MySingletonClass.m

 

复制代码
#import "MySingletonClass.h"

@implementation MySingletonClass

//1、为单例对象实现一个静态实例,并初始化,然后设置成nil,
static MySingletonClass *manager = nil;

//2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例,
+(MySingletonClass *)sharedInstance{
    
    @synchronized(self) {
        if(manager == nil) {
            manager = [[MySingletonClass  alloc] init]; //   assignment   not   done   here
        }
    }
    return manager;
}

//3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实力的时候不产生一个新实例,
+(id)allocWithZone:(NSZone *)zone{
    @synchronized(self){
        
        if (!manager) {
            
            manager = [super allocWithZone:zone]; //确保使用同一块内存地址
            
            return manager;
            
        }
        
        return nil;
    }
}

//4、适当实现copyWithZone,release和autorelease。
- (id)init;
{
    @synchronized(self) {
        
        if (self = [super init]){
            
            return self;
        }
        
        return nil;
    }
}

//确保copy对象也是唯一
- (id)copyWithZone:(NSZone *)zone;{
    
    return self;
    
}
复制代码

 

本文示例源码下载:http://www.oschina.net/code/snippet_2337537_52413

 

参考链接:

http://www.cnblogs.com/lyanet/archive/2013/01/11/2856468.html

http://blog.sina.com.cn/s/blog_71715bf80101a8mm.html

 

 

以上是关于iOS 单例模式的主要内容,如果未能解决你的问题,请参考以下文章

IOS开发之单例设计模式

常用代码片段

常用代码片段

iOS 委托和单例模式

性能比较好的单例写法

iOS经常使用设计模式——单例模式