zoukankan      html  css  js  c++  java
  • IOS中单例的简单使用

    单例的写法,需要用到GCD。如下:

    在.h中

    @interface JFSingleton : NSObject
    
    @property(nonatomic,copy) NSString *tempStr;
    ///类方法
    +(JFSingleton *) sharedInstance;
    
    @end

    在.m中,有两种写法。dispatch_once是线程安全的,保证多线程时最多调用一次

    方法一:

     1 @implementation JFSingleton
     2 
     3 static JFSingleton *_onlyPerson = nil;
     4 
     5 ///重写该方法,该方法是给对象分配内存时最终都会调用的方法,保证内存空间只分配一次
     6 +(instancetype) allocWithZone:(struct _NSZone *)zone{
     7     if (!_onlyPerson) {
     8         static dispatch_once_t onceToken; // 9         //dispatch_once是线程安全的,保证多线程时最多调用一次
    10         dispatch_once(&onceToken,^{
    11             _onlyPerson = [super allocWithZone:zone];
    12         });
    13     }
    14     return _onlyPerson;
    15 }
    16 
    17 //第一次使用单例时,会调用这个init方法
    18 -(instancetype)init{
    19     static dispatch_once_t onceToken;
    20     dispatch_once(&onceToken,^{
    21         _onlyPerson = [super init];
    22         //其它初始化操作
    23         self.tempStr = @"firstValue";
    24     });
    25     return _onlyPerson;
    26 }
    27 
    28 +(JFSingleton *)sharedInstance{
    29     return [[self alloc]init];
    30 }
    31 
    32 @end
    -(id)copyWithZone:(struct _NSZone *)zone{
        return _onlyPerson;
    }

    方法二:该法相对简单

     1 @implementation JFSingleton
     2 
     3 static JFSingleton *_onlyPerson = nil;
     4 + (JFSingleton *) sharedInstance
     5 {
     6     static dispatch_once_t onceToken;
     7     dispatch_once(&onceToken, ^{
     8         _onlyPerson = [[self alloc] init];
     9     });
    10 
    11     return _onlyPerson;
    12 }
    13 
    14 // 当第一次使用这个单例时,会调用这个init方法。
    15 - (id)init{
    16     self = [super init];
    17     if (self) {
    18         // 通常在这里做一些相关的初始化任务
    19         self.tempStr = @"someSth";
    20     }
    21     return self;
    22 }
    23 
    24 @end

     标准的单例方法需要重写 copyWithZone,allocWithZone,init,确保以任何方式创建出来的对象只有一个。

  • 相关阅读:
    TRECT的使用
    杂记
    Delphi中停靠技术的实现
    高级停靠(Dock)技术的实现
    高级停靠(Dock)技术的实现
    vue组件内的元素转移到指定位置
    mintui loadmore组件使用+代码优化
    vue项目进行nuxt改造
    blob与arraybuffer
    vue项目首屏加载过久处理笔记
  • 原文地址:https://www.cnblogs.com/Apologize/p/4725101.html
Copyright © 2011-2022 走看看