iOS 单例模式

1. 单例的概念以及在iOS开发中的实现一个单例类

单例概念:保证一个类只有一个实例,并且提供一个访问它的全局访问点。


#import "DataManager.h"

static dispatch_once_t onceToken = 0;
static DataManager * manager = nil;

@implementation DataManager

// 重写load或initialize,保证在调用的时候,此单例已经是有值的了
+ (void)initialize {
    NSLog(@"DataManager initialize");
    NSLog(@"%@",[self manager]);
}
/// 重写alloc或init方法,防止重复生成此对象,
+ (instancetype)alloc {
    if (manager) {
        // 方式1:抛异常
//        NSException * ex = [[NSException alloc] initWithName:@"异常" reason:@"重复生成DataManager对象" userInfo:@{@"1":@"123"}];
//        [ex raise];
        // 方式2:也可以返回唯一值,别人写[[DataManager alloc]init]和[DataManager manager]返回的是同一个内存地址
        return manager;
    }

    manager = [super alloc];
    return manager;
    
}


+ (instancetype)manager {
    dispatch_once(&onceToken, ^{
        if (manager == nil) {
            manager = [[DataManager alloc] init];
        }
    });
    return manager;
    
}
// 清除这个单例,把manager置nil,onceToken置0
+ (void)cleanManager {
    onceToken = 0;
    manager = nil;
}
@end

swift 版 , 这个在释放的时候有点麻烦。

class SingleClass: NSObject {
    static let defaultManager = SingleClass.init()
    var money = 13.5
}

在补充一个单例的销毁,应用场景是这样的, 一个用户登录了app,用单例保存了,账号,密码之类的信息,当用户退出时,需要把信息删除掉, 但是一个一个属性置nil太麻烦了,那就干脆在重新登录的时候, 再次alloc 一个吧, 在用户注销时写, 等到其他地方在获取的时候, 会重新执行dispatch_once内部的代码.

// 清除这个单例,把manager置nil,onceToken置0
+ (void)cleanManager {
    onceToken = 0;
    manager = nil;
}

为什么写 0l? 因为

typedef long dispatch_once_t;

官方写的别名,默认值是0,

 * A predicate for use with dispatch_once(). It must be initialized to zero.

 * Note: static and global variables default to zero.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值