• 单例对象


    在开发中经常需要使用单例对象。今天主要说的是单例宏

    首先先简单介绍一下

    1.单例设计模式(Singleton)

    1> 什么: 它可以保证某个类创建出来的对象永远只有1个

    2> 作用(为什么要用)

    * 节省内存开销

    * 如果有一些数据, 整个程序中都用得上, 只需要使用同一份资源(保证大家访问的数据是相同的,一致的)

    * 一般来说, 工具类设计为单例模式比较合适

    3> 怎么实现

    * MRC(非ARC)

    * ARC

    代码采用的是mrc的环境

    单独创建一个.h文件 例如SingleTon.h

     1 //帮助实现单例设计模式
     2 /*
     3  alloc方法内部会调用allocWithZone
     4  */
     5 
     6 #define SingletonH(methodName) +(instancetype)shared##methodName;
     7 
     8 #if __has_feature(objc_arc)//是arc
     9 
    10 #define SingletonM(methodName)
    11 static id _instance = nil;
    12 
    13 +(instancetype)allocWithZone:(struct _NSZone *)zone
    14 {
    15     
    16     if(_instance == nil)
    17     {
    18         static dispatch_once_t onceToken;
    19         dispatch_once(&onceToken, ^{
    20             _instance = [super allocWithZone:zone];
    21         });
    22     }
    23     return _instance;
    24 }
    25 +(instancetype)shared##methodName
    26 {
    27     return [[self alloc]init];
    28 }
    29 
    30 #else//不是arc
    31 
    32 #define SingletonM(methodName)
    33 static id _instance = nil;
    34 
    35 +(instancetype)allocWithZone:(struct _NSZone *)zone
    36 {
    37 
    38 if(_instance == nil)
    39 {
    40 static dispatch_once_t onceToken;
    41 dispatch_once(&onceToken, ^{
    42 _instance = [super allocWithZone:zone];
    43 });
    44 }
    45 return _instance;
    46 }
    47 -(oneway void)release
    48 {
    49 
    50 }
    51 
    52 -(instancetype)retain
    53 {
    54 return self;
    55 }
    56 -(NSUInteger)retainCount
    57 {
    58 return 1;
    59 }
    60 +(instancetype)shared##methodName
    61 {
    62 return [[self alloc]init];
    63 }
    64 
    65 #endif

    代表的含义是说:下一行属于它  

    然后在使用的时候

    soundTool.h文件

    #import <Foundation/Foundation.h>
    #import "singleTon.h"
    @interface soundTool : NSObject
    SingletonH(sound)
    @end
    

     soundTool.m文件

    #import "soundTool.h"
    
    @implementation soundTool
    //注意里边的方法名不要跟类名相同(大小写都不行得)
    SingletonM(sound)
    
    @end
    

    然后在controller.m文件中

    - (void)viewDidLoad {
        [super viewDidLoad];
        dataTool *d1 = [dataTool shareddatatools];
        dataTool *d2 = [dataTool shareddatatools];
        soundTool *s1 = [soundTool sharedsound];
        soundTool *s2 = [soundTool sharedsound];
        NSLog(@"%p %p ",d1,d2);
        NSLog(@"%p %p ",s1,s2);
        
    

     这样就能报保证多个类都是单例的

    有时候 出现mrc 跟arc 混编的状况  

    这样的话在个别的文件  的配置文件中追加 -fobjc-arc (说明是arc文件)

    还有时候可能碰见这样的代码

     //补充
        NSArray *array = [[NSArray alloc]init];
        //判断如果不是arc状态的话  进行array的释放
        #if !__has_feature(objc_arc)
            [array release];
        #endif
    

     这个说明判断如果不是arc环境的话 就要对array进行释放

    对上述的代码,有任何疑问,可以在下方留言。 也可以给我发邮件咨询:673658917@qq.com 或者是直接加qq:673658917 转载请注明出处,谢谢合作。 睡觉舒服,那是给死人准备的,加油吧,一年后你会感谢现在的自己的。
  • 相关阅读:
    浅析Java源码之LinkedList
    浅析Java源码之ArrayList
    Vue源码终笔-VNode更新与diff算法初探
    Vue源码后记-更多options参数(2)
    Vue源码后记-更多options参数(1)
    Vue源码后记-其余内置指令(3)
    Vue源码后记-其余内置指令(2)
    Vue源码后记-其余内置指令(1)
    Vue源码后记-vFor列表渲染(3)
    Linux/CentOS 7 timezone 修改
  • 原文地址:https://www.cnblogs.com/lishanshan/p/4984307.html
Copyright © 2020-2023  润新知