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
上一篇: iOS 单例