您现在的位置是: 首页

iOS单例创建

程序员文章站 2022-07-13 23:38:22
...

常规的创建单例

.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