iOS 单例模式

2017-03-01  本文已影响19人  印林泉

创建

//
//  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

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

上一篇下一篇

猜你喜欢

热点阅读