单例模式


title : 单例模式
category : IOS


单例模式

标签(空格分隔): IOS


[TOC]

概述

单例模式的作用

可以保证在程序运行过程中,一个类只有一个实例,而且该实例易于供外界访问

单例模式的使用场合

在整个应用程序中,共享一份资源(这份资源只需要创建初始化一次)

单例的实现步骤

  • 保留一个全局的static的实例
  • 重写allocWithZone:方法
  • 提供一个类方法,方便外界访问
  • 重写copyWithZone:防止外界通过copy方法访问

.h文件

#import 
@interface JLPerson : NSObject
+ (instancetype)sharedInstance;
@end

.m文件


#import "JLPerson.h"

@interface JLPerson()

@end

@implementation JLPerson

// 保留一个全局的static的实例,为了保证不让外界方位,只有本文件才可以访问
static id _instance;

// 重写allocWithZone:方法,在这里创建唯一的实例
+ (instancetype)allocWithZone:(struct _NSZone *)zone
{
    //dispatch_once保证整个程序运行过程中只执行一次
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [super allocWithZone:zone];
    });
    return _instance;
}

// 提供一个类方法,方便外界访问
+ (instancetype)sharedInstance
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instance = [[self alloc] init];
    });
    return _instance;
}

// 重写copyWithZone:防止外界通过copy方法访问
- (id)copyWithZone:(NSZone *)zone
{
    return _instance;
}
@end

单例实现的宏定义

宏定义方式一

//
//  JLSingleton.h
//  单例模式
//
//  Created by 袁俊亮 on 16/4/27.
//  Copyright © 2016年 袁俊亮. All rights reserved.
//

// .h文件
#define JLSingletonH + (instancetype)sharedInstance;

// .m文件

#define JLSingletonM \
 \
static id _instance; \
 \
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
    static dispatch_once_t onceToken; \
    dispatch_once(&onceToken, ^{ \
        _instance = [super allocWithZone:zone]; \
    }); \
    return _instance; \
} \
 \
+ (instancetype)sharedInstance \
{ \
    static dispatch_once_t onceToken; \
    dispatch_once(&onceToken, ^{ \
        _instance = [[self alloc] init]; \
    }); \
    return _instance; \
} \
 \
- (id)copyWithZone:(NSZone *)zone \
{ \
    return _instance; \
}

宏定义方式二

//
//  JLSingleton.h
//  单例模式
//
//  Created by 袁俊亮 on 16/4/27.
//  Copyright © 2016年 袁俊亮. All rights reserved.
//

// .h文件(其中##为连接符,当外界传入name值的时候,会自动替换)
#define JLSingletonH(name) + (instancetype)shared##name;

// .m文件

#define JLSingletonM(name) \
 \
static id _instance; \
 \
+ (instancetype)allocWithZone:(struct _NSZone *)zone \
{ \
    static dispatch_once_t onceToken; \
    dispatch_once(&onceToken, ^{ \
        _instance = [super allocWithZone:zone]; \
    }); \
    return _instance; \
} \
 \
+ (instancetype)shared##name \
{ \
    static dispatch_once_t onceToken; \
    dispatch_once(&onceToken, ^{ \
        _instance = [[self alloc] init]; \
    }); \
    return _instance; \
} \
 \
- (id)copyWithZone:(NSZone *)zone \
{ \
    return _instance; \
}



你可能感兴趣的:(单例模式)