iOS轻松使用单例

一、单例模式:

单例模式不需要传递任何参数,就有效地解决了不同代码间的数据共享问题。单例类是一个非常重要的概念,因为它们表现出了一种十分有用的设计模式。单例类的应用贯穿于整个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 

@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轻松使用单例)