单例 - IOS

作者: Luyize | 来源:发表于2016-05-07 00:09 被阅读161次

    一、基本概念

    单例设计模式运用较为普遍、广泛且较为简单的设计模式之一,他的设计原理是始终返回一个实例,即一个类始终只有一个实例
    
    单例可以作为全局文件存在 保存一些全局数据
    

    二、创建单例的基本步骤

    1、保留一个单例对象的静态实例,并初始化为nil
    
    2、提供一个类方法让外界访问唯一的实例
    
    3、重写allocWithZone方法,在这里创建唯一的实例,注意线程安全
    
    3、遵守NSCopying协议,实现copyWithZone方法
    
      单例模式介绍
    
      - 内存中只有一个对象实例
        
      实现的思路:
    
        1>为类增加一个static id instance; 变量
        2>重写类方法allocWithZone方法,在这里创建唯一的实例,注意线程安全   
        3>封装一个shareXxxx方法,在该方法中调用alloc方法创建对象
    

    三、练习:

    将用户的个人信息保存在单例类中
    

    四、代码

    main.m
    #import <Foundation/Foundation.h>
    #import "User.h"
    #import "Person.h"
    int main(int argc, const char * argv[]) {
    @autoreleasepool {

        /*
         * 将登录的用户信息,做为全局对象,使其不管在哪里都能够访问
         */
        
        User *user = [User shareUser];
        
        user.name = @"小红";
        user.password = @"123456";
        
        
        Person *person = [[Person alloc]init];
        
        [person outputNameAndPwd];
    
    
    }
      return 0;
    }
    

    User.h
    #import <Foundation/Foundation.h>

    @interface User : NSObject<NSCopying>
    
    @property (nonatomic,copy) NSString *name;
    @property (nonatomic,copy) NSString *password;
    
     单例的类方法命名一般用share+当前类名
     + (instancetype)shareUser;
    
     @end
    

    User.m

    #import "User.h"
    static 修饰的对象,只有在程序结束时才会被释放
    static User *user = nil;
    
    @implementation User
    
     /*
     * 创建单例类的步骤
    
      * 1、保留一个单例对象的静态实例,并初始化为nil
    
       * 2、声明和实现一个类方法,返回一个有值的该类对象
    
       * 3、重写allocWithZone方法,做判空处理
    
       * 4、从写copyWithZone方法,防止copy是创建新对象
    
       */
    
    
      + (instancetype)shareUser{
    
        synchronized能保证里面的内容同时只能被一个线程执行
        @synchronized (self) {
        
        首先判断是否为nil,如果为nil在创建
        if (user == nil) {
            
            user = [[User alloc]init];
            
        }
    }
    
          return user;
    }
    
    
    + (instancetype)allocWithZone:(struct _NSZone *)zone{
    
    if (user == nil) {
        
        user = [super allocWithZone:zone];
        
    }
    
    return user;
    
    
    }
    
    - (id)copyWithZone:(NSZone *)zone{
    
        return user;
    }
    

    Person.h

    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    
    - (void)outputNameAndPwd;
    
    @end
    

    Person.m

    #import "Person.h"
    #import "User.h"
    @implementation Person
    
    - (void)outputNameAndPwd{
    
      User *user = [[User alloc]init];
    
      NSLog(@"%@ %@ ",user.name,user.password);
    
    }
    
    @end

    相关文章

      网友评论

        本文标题: 单例 - IOS

        本文链接:https://www.haomeiwen.com/subject/bhbjrttx.html