iOS轻松使用单例

作者: 尼古拉斯超仔 | 来源:发表于2017-04-11 15:31 被阅读183次

一、单例模式:

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

二、单例模式的要点:

1、某个类只能有一个实例。
2、它必须自行创建这个实例。
3、它必须自行向整个系统提供这个实例。

三、单例模式的优点:

1、实例控制:Singleton 会阻止其他对象实例化其自己的 Singleton 对象的副本,从而确保所有对象都访问唯一实例。 
2、灵活性:因为类控制了实例化过程,所以类可以更加灵活修改实例化过程IOS中的单例模式。

四、创建一个单例至少需要四个步骤:

1、为单例对象实现一个静态实例,并初始化,然后设置成nil。
2、实现一个实例构造方法检查上面声明的静态实例是否为nil,如果是则新建并返回一个本类的实例。
3、重写allocWithZone方法,用来保证其他人直接使用alloc和init试图获得一个新实例的时候不产生一个新实例。
4、适当实现copyWithZone。
Demo:创建一个单例类SingletonClass,定义它的属性和方法。
.h

#import <Foundation/Foundation.h>

@interface SingletonClass : NSObject
@property (assign, nonatomic)int age;//定义一个属性
//单例方法
+(SingletonClass *)sharedInstance;
@end

.m

#import "SingletonClass.h"

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

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

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

//4、适当实现copyWithZone,确保copy对象也是唯一
- (id)copyWithZone:(NSZone *)zone{
    
    return self;
    
}
//初始化方法,初始化自己的属性
- (id)init{
    @synchronized(self) {
        
        if (self = [super init]){
            self.age = 10;
            return self;
        }
        
        return nil;
    }
}

@end

使用:#import "SingletonClass.h"

SingletonClass *singleton = [SingletonClass sharedInstance];
singleton.age = 15;

相关文章

  • iOS开发 单例使用问题

    iOS开发 单例使用问题 iOS开发 单例使用问题

  • iOS开发 单例使用问题

    iOS开发 单例使用问题 iOS开发 单例使用问题

  • iOS轻松使用单例

    一、单例模式: 单例模式不需要传递任何参数,就有效地解决了不同代码间的数据共享问题。单例类是一个非常重要的概念,因...

  • iOS 单例模式 or NSUserDefaults

    本文内容:iOS的单例模式NSUserDefaults的使用总结:iOS单例模式 and NSUserDefaul...

  • 单例

    iOS单例模式iOS之单例模式初探iOS单例详解

  • iOS单例模式容错处理

    ios 单例模式容错处理 1、单例模式的使用和问题解决 在ios开发的过程中,使用单例模式的场景非常多。系统也有很...

  • @sychronized和dispatch_once,以及对单例

    在iOS开发中,经常使用到单例。单例是Cocoa中被广泛使用的设计模式之一。单例使得某个类在整个applicati...

  • iOS 单例模式

    关于单例模式的详解,看完这几篇,就完全了然了。iOS 单例模式iOS中的单例模式iOS单例的写法

  • ios - 单例使用

    一直想花时间把之前项目常用的控件及功能整理出来,本打算把AFNetworking二次封装下,想到需要使用单例来封装...

  • ios — 单例使用

    一直想花时间把之前项目常用的控件及功能整理出来,本打算把AFNetworking二次封装下,想到需要使用单例来封装...

网友评论

    本文标题:iOS轻松使用单例

    本文链接:https://www.haomeiwen.com/subject/qmtuattx.html