实现单例的步骤:
1. 定义一个静态变量,能够记录第一次实例化出来的对象
2. 定义一个shared方法,供其他对象使用
3. 实现shared方法,使用 @dispatch_once { _instance = [[self alloc] init]; }
例如:
static SoundTools*_instance;
+ (instancetype)sharedSoundTools {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_instance = [[self alloc] init];
});
return _instance;
}
// 使用指定的内存区域,为对象分配空间调用的类方法
// allocWithZone方法,无论对象如何被实例化,最终都会调用到这个方法
// 如果要"彻底的解决"用类方法和alloc方法实例化出来的对象一致!
+ (id)allocWithZone:(struct_NSZone *)zone {
static dispatch_once_tonceToken;
dispatch_once(&onceToken, ^{
_instance = [superallocWithZone:zone];
});
return _instance;
}
- (id)copyWithZone:(NSZone*)zone {
//建立一个self对象的拷贝,self既然已经存在,_instance应该已经被实例化了
return _instance;
}
二:将单例抽取成一个宏,下次直接使用即可。
1,定义文件Singleton.h
/**
提示:如果是MRC程序,请粘贴以下代码
#if!__has_feature(objc_arc)
-(oneway void)release { }
-(id)autorelease { return _instance; }
-(id)retain { return _instance; }
-(NSUInteger)retainCount { return UINT32_MAX; }
#endif
*/
// 1. 替换.h中的内容
#definesingletonInterface(className) +(instancetype)shared##className;
// 2. 替换.m中的内容
#definesingletonImplementation(className) \
staticclassName *_instance; \
+(instancetype)shared##className { \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [[self alloc] init]; \
}); \
return _instance; \
} \
+(id)allocWithZone:(struct _NSZone *)zone { \
static dispatch_once_t onceToken; \
dispatch_once(&onceToken, ^{ \
_instance = [super allocWithZone:zone]; \
}); \
return _instance; \
} \
-(id)copyWithZone:(NSZone *)zone { \
return _instance; \
}
// 提示最后一行不要使用 \
三:具体实现(新建了一个CZNewObject类)
.h文件:
//先导入头文件
#import "Singleton.h"
@interface CZNewObject : NSObject
singletonInterface(CZNewObject);
- (void)playWithName:(NSString*)name;
@end
.m文件:
@implementationCZNewObject
singletonImplementation(CZNewObject);
@end