zoukankan      html  css  js  c++  java
  • 源码0501-10-掌握-单粒模式

    单粒设计模式

    单粒宏定义

    //  ViewController.m
    //  10-掌握-单粒模式
    #import "ViewController.h"
    #import "XMGPerson.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
    //    XMGPerson *person1 = [[XMGPerson alloc] init];
    //    person1.name = @"jack";
    //    
    //    XMGPerson *person2 = [[XMGPerson alloc] init];
    //    XMGPerson *person3 = [[XMGPerson alloc] init];
    //    XMGPerson *person4 = [[XMGPerson alloc] init];
        
    //    NSLog(@"%p %p %p %p", person1, person2, person3, person4);
    //    NSLog(@"%@", person3.name);
        
    //    NSLog(@"%@ %@", [XMGPerson sharedPerson], [XMGPerson sharedPerson]);//两个类地址一样;
    }
    
    @end

    //  XMGPerson.h
    //  10-掌握-单粒模式
    #import <Foundation/Foundation.h>
    
    @interface XMGPerson : NSObject
    /** 名字 */
    @property (nonatomic, strong) NSString *name;
    
    + (instancetype)sharedPerson;
    @end
    //  XMGPerson.m
    //  10-掌握-单粒模式
    #import "XMGPerson.h"
    
    @interface XMGPerson() <NSCopying>
    
    @end
    
    @implementation XMGPerson
    
    static XMGPerson *_person;
    
    + (instancetype)allocWithZone:(struct _NSZone *)zone
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _person = [super allocWithZone:zone];
        });
        return _person;
    }
    
    + (instancetype)sharedPerson
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _person = [[self alloc] init];//self alloc 会自动掉用上面的allocWithZone方法
        });
        return _person;
    }
    
    - (id)copyWithZone:(NSZone *)zone
    {
        return _person;
    }
    @end
    //  XMGPerson.h
    //  10-掌握-单粒模式
    #import <Foundation/Foundation.h>
    
    @interface XMGPerson : NSObject
    /** 名字 */
    @property (nonatomic, strong) NSString *name;
    
    + (instancetype)sharedPerson;
    @end
    //  XMGPerson.m
    //  10-掌握-单粒模式
    #import "XMGPerson.h"
    
    @interface XMGPerson() <NSCopying>
    
    @end
    
    @implementation XMGPerson
    
    static XMGPerson *_person;
    
    + (instancetype)allocWithZone:(struct _NSZone *)zone
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _person = [super allocWithZone:zone];
        });
        return _person;
    }
    
    + (instancetype)sharedPerson
    {
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            _person = [[self alloc] init];
        });
        return _person;
    }
    
    - (id)copyWithZone:(NSZone *)zone
    {
        return _person;
    }
    @end

    10-掌握-单粒模式

    //  ViewController.h
    //  10-掌握-单粒模式
    #import <UIKit/UIKit.h>
    #import "XMGSingleton.h"
    
    @interface ViewController : UIViewController
    XMGSingletonH
    @end
    //  ViewController.m
    //  10-掌握-单粒模式
    
    #import "ViewController.h"
    #import "XMGPerson.h"
    #import "XMGCar.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    XMGSingletonM
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
    
    }
    
    @end

    单粒宏的定义

    // .h文件
    #define XMGSingletonH + (instancetype)sharedInstance;  //声明的地方
    
    // .m文件
    #define XMGSingletonM   这里的一行替代后面的一片
    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 _instace; 
    }
    //  XMGCar.h
    //  10-掌握-单粒模式
    #import <Foundation/Foundation.h>
    #import "XMGSingleton.h"
    
    @interface XMGCar : NSObject
    XMGSingletonH
    @end
    //  XMGCar.m
    //  10-掌握-单粒模式
    
    #import "XMGCar.h"
    
    @interface XMGCar()
    
    @end
    
    @implementation XMGCar
    XMGSingletonM
    @end

    带参数的宏定义

    // .h文件
    #define XMGSingletonH(name) + (instancetype)shared##name;
    
    // .m文件
    #define XMGSingletonM(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; 
    }

    带参数的宏的使用

    //  XMGPerson.h
    //  10-掌握-单粒模式
    #import <Foundation/Foundation.h>
    #import "XMGSingleton.h"
    
    @interface XMGPerson : NSObject
    /** 名字 */
    @property (nonatomic, strong) NSString *name;
    
    XMGSingletonH(Person)
    @end
    
    
    //  XMGPerson.m
    //  10-掌握-单粒模式
    #import "XMGPerson.h"
    
    @interface XMGPerson()
    
    @end
    
    @implementation XMGPerson
    XMGSingletonM(Person)
    @end
    //  ViewController.m
    //  10-掌握-单粒模式
    #import "ViewController.h"
    #import "XMGPerson.h"
    #import "XMGCar.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    XMGSingletonM(ViewController) 这之后 viewController就是一个单粒了
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        NSLog(@"%@ %@", [ViewController sharedViewController], [[ViewController alloc] init]);
        NSLog(@"%@ %@", [XMGCar sharedCar], [[XMGCar alloc] init]);
        
    //    XMGPerson *person1 = [[XMGPerson alloc] init];
    //    person1.name = @"jack";
    //    
    //    XMGPerson *person2 = [[XMGPerson alloc] init];
    //    XMGPerson *person3 = [[XMGPerson alloc] init];
    //    XMGPerson *person4 = [[XMGPerson alloc] init];
        
    //    NSLog(@"%p %p %p %p", person1, person2, person3, person4);
    //    NSLog(@"%@", person3.name);
        
    //    NSLog(@"%@ %@", [XMGPerson sharedPerson], [XMGPerson sharedPerson]);
    }
    
    @end

    13-掌握-单粒模式(非GCD)

    //  ViewController.m
    //  10-掌握-单粒模式
    #import "ViewController.h"
    #import "XMGPerson.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
    //    XMGPerson *person1 = [[XMGPerson alloc] init];
    //    person1.name = @"jack";
    //    
    //    XMGPerson *person2 = [[XMGPerson alloc] init];
    //    XMGPerson *person3 = [[XMGPerson alloc] init];
    //    XMGPerson *person4 = [[XMGPerson alloc] init];
        
    //    NSLog(@"%p %p %p %p", person1, person2, person3, person4);
    //    NSLog(@"%@", person3.name);
        
        NSLog(@"%@ %@", [XMGPerson sharedInstance], [[XMGPerson alloc] init]);
        
        dispatch_async(dispatch_get_global_queue(0, 0), ^{  //不加锁会存在同时掉用有安全问题;
            [[XMGPerson alloc] init];
        });
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            [[XMGPerson alloc] init];
        });
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            [[XMGPerson alloc] init];
        });
    }
    
    @end
    //  XMGPerson.h
    //  10-掌握-单粒模式
    #import <Foundation/Foundation.h>
    
    @interface XMGPerson : NSObject
    + (instancetype)sharedInstance;
    @end
    //  XMGPerson.m
    //  10-掌握-单粒模式
    #import "XMGPerson.h"
    
    @interface XMGPerson()
    
    @end
    
    @implementation XMGPerson
    
    static id _instance;
    
    + (instancetype)allocWithZone:(struct _NSZone *)zone
    {
        @synchronized(self) { //加锁防撞
            if (_instance == nil) {
                _instance = [super allocWithZone:zone];
            }
        }
        return _instance;
    }
    
    + (instancetype)sharedInstance
    {
        @synchronized(self) {
            if (_instance == nil) {
                _instance = [[self alloc] init];
            }
        }
        return _instance;
    }
    
    - (id)copyWithZone:(NSZone *)zone
    {
        return _instance;
    }
    @end
    本人无商业用途,仅仅是学习做个笔记,特别鸣谢小马哥,学习了IOS,另日语学习内容有需要文本和音频请关注公众号:riyuxuexishuji
  • 相关阅读:
    021.day21 反射 Class类 反射常用操作
    020.day20 线程概述 多线程优缺点 线程的创建 线程常用方法 生命周期 多线程同步
    019.day19 缓冲流 对象流 标准输入输出流
    018.day18 map集合如何实现排序 File类 IO流 字节流 字符流 编码
    017.day17 Map接口 克隆 treeSet集合排重缺陷
    016.day16 HashSet TreeSet 比较器Comparable Comparator
    015.day15
    014.day14
    013.day13
    线程
  • 原文地址:https://www.cnblogs.com/laugh/p/6555126.html
Copyright © 2011-2022 走看看