zoukankan      html  css  js  c++  java
  • 单例设计模式-02-单例两种设计模式(完善)

      1 //
      2 //  ViewController.m
      3 //  01-单例设计模式
      4 //
      5 //  Created by mac on 16/4/22.
      6 //  Copyright © 2016年 mac. All rights reserved.
      7 //
      8 #import "LYMusicTool.h"
      9 
     10 #import "ViewController.h"
     11 
     12 @interface ViewController ()
     13 
     14 @end
     15 
     16 @implementation ViewController
     17 /**
     18  *
     19     1> .static 修饰不同东西有不同作用域:修饰全局变量(当前文件),
     20     2> .extern 可以引用其他文件的全局变量
     21  
     22     3> .单例:三部曲(全局id类型静态static对象+接口方法+重写allocWithZone:)+1(接口)
     23         1).懒方式-->>第一次用到单例对象时,再创建
     24         2).饿汉式-->>程序类一加载就创建单例对象    重写load方法
     25  */
     26 
     27 - (void)viewDidLoad {
     28     [super viewDidLoad];
     29     
     30 //    [self textB];
     31 }
     32 
     33 /**
     34  *  extern引用的使用
     35  */
     36 - (void)textB {
     37     
     38    LYMusicTool *tool = [LYMusicTool sharedMusicTool];
     39     //引用某个全局变量,(并非定义)
     40     extern id _music;
     41     _music = nil;
     42     NSLog(@"%@ === %@ ", _music, tool);
     43 }
     44 
     45 /**
     46  *  1. 懒汉式->单例
     47  */
     48 - (void)textA {
     49     
     50     LYMusicTool *musicTool1 = [[LYMusicTool alloc] init];
     51     LYMusicTool *musicTool2 = [musicTool1 copy];
     52     LYMusicTool *musicTool3 = [musicTool2 copy];
     53     LYMusicTool *tool4 = [LYMusicTool sharedMusicTool];
     54     LYMusicTool *tool5 = [LYMusicTool sharedMusicTool];
     55     
     56     NSLog(@"=%p==%p==%p=", musicTool3, tool4, tool5);
     57 }
     58 
     59 @end
     60 
     61 ////////////////////////////////02-华丽的分割线///////////////////////////////
     62 
     63 //
     64 //  LYMusicTool.m
     65 //  01-单例设计模式 -->>1).懒汉式
     66 //
     67 //  Created by mac on 16/4/22.
     68 //  Copyright © 2016年 mac. All rights reserved.
     69 
     70 //alloc的本质是调用:-->>allocWithZone:方法
     71 
     72 #import "LYMusicTool.h"
     73 
     74 @implementation LYMusicTool
     75 /**
     76  *  1. 创建一个全局变量,作用域比较广泛,所有的文件中都能够访问
     77  */
     78  id _music;
     79 
     80 /**
     81  *  2. 重写allocWithZone:只分配一次内存
     82  */
     83 + (instancetype)allocWithZone:(struct _NSZone *)zone {
     84     
     85     if (_music == nil) { //防止频繁加锁
     86         @synchronized(self) { //加互斥锁防止多线程同时进来访问,更加安全,真正的单例
     87             if (!_music) { //防止创建多次
     88                 _music = [super allocWithZone:zone];
     89             }
     90         }
     91     }
     92     return _music;
     93 }
     94 
     95 /**
     96  *  3. 既保证了单例(只分配一次内存),又保证了只init一次;
     97  */
     98 + (instancetype)sharedMusicTool {
     99     
    100     if (_music == nil) { //防止频繁加锁
    101         @synchronized(self) {
    102             if (!_music) { //防止:创建多次和多次初始化
    103                 _music = [[self alloc] init];
    104             }
    105         }
    106     }
    107     return _music;
    108 }
    109 
    110 /**
    111  *  5.copy使用
    112  *
    113  *  1). 遵守coping协议
    114  *  2). 重写协议方法copyWithZone:拦截copy产生新对象
    115  *  3). 不用判断_music是否空,是因为copy的前提是有对象,有对象 所以_music有值
    116  */
    117 - (id)copyWithZone:(NSZone *)zone {
    118     
    119     return _music;
    120 }
    121 @end
    122 
    123 ////////////////////////////////03-华丽的分割线///////////////////////////////
    124 
    125 //
    126 //  LYLazyTool.m
    127 //  01-单例设计模式  :2)饿汉式
    128 //
    129 //  Created by mac on 16/4/22.
    130 //  Copyright © 2016年 mac. All rights reserved.
    131 //
    132 
    133 #import "LYLazyTool.h"
    134 
    135 @implementation LYLazyTool
    136 static id _instance;
    137 
    138 + (instancetype)sharedLazyTool {
    139     
    140     return _instance;
    141 }
    142 
    143 + (instancetype)allocWithZone:(struct _NSZone *)zone {
    144     
    145     if (_instance == nil) {
    146         _instance = [super allocWithZone:zone];
    147     }
    148     return _instance;
    149 }
    150 
    151 /** 
    152  *  当类加载到OC运行时环境中(内存中),就会调用一次(一个类只会加载一次)
    153  *  类装载到内存的时候调用
    154  */
    155 + (void)load {
    156     
    157      NSLog(@"load---");
    158     _instance = [[self alloc] init];
    159     NSLog(@"load--%@", _instance);
    160 }
    161 /**
    162  *  第一次使用类的时候才会调用
    163  */
    164 + (void)initialize {
    165     
    166     NSLog(@"initialize---");
    167 }
    168 @end
    时光见证了成长,还很无知,我想一点点幼稚转为有知!
  • 相关阅读:
    ConcurrentHashMap
    Linux中如何开启8080端口供外界访问 和开启允许对外访问的端口8000
    CentOs 7 Linux系统下我的/etc/sysconfig/路径下无iptables文件
    CentOS7开启SSH服务
    Centos7下Samba服务器配置
    CentOS7(Linux)网络yum源配置
    Linux(Centos7)中配置Java环境变量
    SpringAOP-什么是面向切面编程?
    Swagger Demo
    自定义个Bean名称生成策略, 解决不同包下同名类问题/AnnotationBeanNameGenerator
  • 原文地址:https://www.cnblogs.com/foreveriOS/p/5420876.html
Copyright © 2011-2022 走看看