单例总结

179 阅读1分钟

单例如何避免别人误调用alloc 、 copy、mutableCopy

1:static ZYSingleClass * instance = nil;

2://遵守协议
@interface ZYSingleClass ()<NSCopying,NSMutableCopying>
@end

3:单例
+(instancetype)ZYShareInstance
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    instance = [[ZYSingleClass alloc] init];
});
return instance;
}

4: //alloc 方法的调用
+(instancetype)allocWithZone:(struct _NSZone *)zone
{
if (instance ==nil) {
    instance = [super allocWithZone:zone];
}
return instance;
}

5://mutableCopy方法调用
-(instancetype)mutableCopyWithZone:(NSZone *)zone
{
return self;
}

6://copy方法调用
-(instancetype)copyWithZone:(NSZone *)zone
{
return self;
}


7:// 调用
 ZYSingleClass *s = [ZYSingleClass ZYShareInstance];
NSLog(@"instance = %@",s);

ZYSingleClass *s1 = [[ZYSingleClass alloc] init];
NSLog(@"alloc = %@",s1);

ZYSingleClass *sc = [s1 copy];
NSLog(@"%@",sc);

ZYSingleClass *smcy = [s1 mutableCopy];
NSLog(@"%@",smcy);


//8 打印
2019-09-04 21:43:40.355055+0800 单例[85102:3443871] instance =
<ZYSingleClass: 0x600001f803a0>
2019-09-04 21:43:40.355228+0800 单例[85102:3443871] alloc =
<ZYSingleClass: 0x600001f803a0>
2019-09-04 21:43:40.355356+0800 单例[85102:3443871] <ZYSingleClass:
0x600001f803a0>
2019-09-04 21:43:40.355464+0800 单例[85102:3443871] <ZYSingleClass:
0x600001f803a0>