美文网首页
iOS单例创建

iOS单例创建

作者: MasterChen | 来源:发表于2016-09-27 18:51 被阅读0次

常规的创建单例

.h文件中

#import <Foundation/Foundation.h>
@interface CD_SingleClass : NSObject<NSCopying>
//单例创建形式(defaultSingle ,shareSingle)
+ (instancetype)shareSingle;
@end

.m文件

    #import "CD_SingleClass.h"
    static CD_SingleClass *defaultSingle = nil; //第一步:静态实例,并初始化

    @implementation CD_SingleClass
    //第二步:实例构造检查静态实例是否为nil
    + (instancetype)shareSingle{
     //保证defaultSingle的内存只被分配一次
    @synchronized (self) {
    if (nil == defaultSingle){
        //1.
        defaultSingle = [[[self class]alloc]init];
    }
    return defaultSingle;
}
    return defaultSingle;
   }

 //第三步:重写allocWithZone方法(执行alloc时调用)
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
if (nil == defaultSingle){
    //只会分配空间而已
    //2.
    return  [super allocWithZone:zone];
}
return defaultSingle;
}

//第四步:重写copyWithZone方法<需要遵守NSCopying协议>
- (id)copyWithZone:(NSZone *)zone{
return defaultSingle;
return self;//返回原对象,不做修改
}

//MRC下的方法重写
- (oneway void)release{
;
}

- (instancetype)autorelease{
    return defaultSingle;
}

- (instancetype)retain{
return defaultSingle;
}

- (NSUInteger)retainCount{
return MAXFLOAT;
}
- (instancetype)init {
@synchronized (self) { //@synchronized  这个主要是考虑多线程的程序,这个指令可以
将{ } 内的代码限制在一个线程执行,如果某个线程没有执行完,其他的线程如果需要执行就得等着。
    [super init];
    
    ;//放一些要初始化的变量
    
    return self;
}
}
@end

使用GCD写

.h中

#import <Foundation/Foundation.h>
@interface CDSharedClass : NSObject<NSCopying>
+ (instancetype)sharedClass;
@end

.m文件中

#import "CDSharedClass.h"
static CDSharedClass *defaultShared = nil;
@implementation CDSharedClass

+ (instancetype)sharedClass {

  //    static CDSharedClass *defaultShared = nil;//第一步:静态实例,并初始化
    //第二部:只分配一次内存
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    defaultShared = [[[self class]alloc]init];
});

return defaultShared;
}

//第三部:重载allocWithZone方法
+ (instancetype)allocWithZone:(struct _NSZone *)zone {

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    defaultShared = [super allocWithZone:zone];
});

return defaultShared;
}

//第四部:重写copyWithZone
- (id)copyWithZone:(NSZone *)zone {
return defaultShared;
}
@end

相关文章

  • iOS 创建单例的方法

    iOS 创建单例的方法 方法一: 方法二:

  • 单例

    iOS单例模式iOS之单例模式初探iOS单例详解

  • ios -- 创建单例

    + (JYueMyTaskManagerService*)sharedMyTaskService { static...

  • ios创建单例

    最近公司项目其中的一个控制器需要做成单例,以保证收到推送或应用内消息时弹出的是同一个界面,看了下相关资料和视频,现...

  • iOS单例创建

    常规的创建单例 .h文件中 .m文件 使用GCD写 .h中 .m文件中

  • iOS单例创建

  • iOS创建单例

    在开发过程中经常会遇到需要单例的时候,然后很多时候大家写的单例其实并不符合要求。下面介绍一个标准的单例。 一般来说...

  • iOS - 单例创建

    Swift创建单例 代码如下:Swift5 对应OC创建单例

  • iOS单例

    在iOS开发中单例用的非常普遍,比如说通知中心,NSUserDefauld等都都是单例模式,原来以为创建一个单例是...

  • iOS 单例模式

    关于单例模式的详解,看完这几篇,就完全了然了。iOS 单例模式iOS中的单例模式iOS单例的写法

网友评论

      本文标题:iOS单例创建

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