iOS 单例模式

  • 单例模式
    保证程序的整个生命周期中,只会创建一个单例类的实例。

  • 应用,适用场景
    轻松实现两个不同类之间的数据通信。

创建

//
//  User.h
//  LearnSingleton
//
//  Created by 印林泉 on 2017/3/1.
//  Copyright © 2017年 yiq. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface User : NSObject

@property (nonatomic, copy) NSString *username;
@property (nonatomic, assign) NSInteger age;

+ (instancetype)shareUser;

@end
//
//  User.m
//  LearnSingleton
//
//  Created by 印林泉 on 2017/3/1.
//  Copyright © 2017年 yiq. All rights reserved.
//

#import "User.h"

@implementation User

static User *user = nil;

+ (instancetype)shareUser {
//    //互斥锁,消耗资源
//    @synchronized (self) {
//        if (!user) {
//            user = [[self alloc]init];
//        }
//    }
    
    //GCD创建单例
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (!user) {
            user = [[self alloc]init];
        }
    });
    return user;
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        if (!user) {
            user = [[self alloc]init];
        }
    });
    return user;
}

- (id)copy {
    return user;
}

- (id)mutableCopy {
    return user;
}

- (NSString *)description {
    return [NSString stringWithFormat:@"username: %@, age: %zd", _username, _age];
}
@end

存储

//
//  LoginView.m
//  LearnSingleton
//
//  Created by 印林泉 on 2017/3/1.
//  Copyright © 2017年 yiq. All rights reserved.
//

#import "LoginView.h"
#import "User.h"

@implementation LoginView

- (void)login {
    User *user = [User shareUser];
    user.username = @"yinlinqvan";
    user.age = 25;
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

@end

读取

//
//  SettingView.m
//  LearnSingleton
//
//  Created by 印林泉 on 2017/3/1.
//  Copyright © 2017年 yiq. All rights reserved.
//

#import "SettingView.h"
#import "User.h"

@implementation SettingView

- (void)about {
    User *user = [User shareUser];
    NSLog(@"%@", user);
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

@end

应用

//
//  ViewController.m
//  LearnSingleton
//
//  Created by 印林泉 on 2017/3/1.
//  Copyright © 2017年 yiq. All rights reserved.
//

#import "ViewController.h"
#import "User.h"
#import "LoginView.h"
#import "SettingView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    LoginView *loginView = [[LoginView alloc] init];
    [loginView login];
    
    SettingView *settingView = [[SettingView alloc]init];
    [settingView about];

    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

程序不被杀死,该对象不变释放。通过这样的单例使用,让所有类共享使用这个单例。用户数据共享,轻松实现两个不同类之间的数据通信。
可以保证单例类只有一个实例存在,整个系统只需要一个全局对象,有利于协调系统行为。
用户信息存储,在登录时将整个用户信息获取,存放在本地文件,这些配置数据,由单例对象统一读取,将服务进程中的其他对象通过单例获取配置信息。简化在复杂环境下的配置管理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,196评论 6 13
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 简介: 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统...
    RunnerFL阅读 659评论 0 0
  • 本文内容:iOS的单例模式NSUserDefaults的使用总结:iOS单例模式 and NSUserDefaul...
    Kingsleeeey阅读 1,750评论 0 5
  • 到头来,青春的誓言还是无法实现,我到底不能改变世界,我能改变的只有我自己,或许有句话说的没有错,我们生而清澈,却终...
    流叶wtj阅读 141评论 0 0