单例 - 创建单例需要重写的方法

实现单例,首先遵循NSCopy协议(遵循协议是为了重写协议中的方法)

  • 在MRC下的示例代码:
#import "AudioTools.h"

@implementation AudioTools

static id _instanceType = nil;
// 自定义类方法创建单例
+(instancetype)sharadAudioTools{
    //一次性执行实现单例
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instanceType = [[self alloc]init];
    });
    return _instanceType;
}
// 严谨写法需要重写此方法,避免alloc]init或new实例化新对象
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instanceType = [super allocWithZone:zone];
    });
    return _instanceType;
}
// 防止对象Copy操作 (一般此方法默认只对NSString类型有效)
-(id)copyWithZone:(NSZone *)zone{
    return _instanceType;
}
//MRC下防止手动销毁对象(重写后不执行任何操作)
-(oneway void)release{
    
}

//以下为其他引用计数器操作方法
-(instancetype)retain{
    return _instanceType;
}
-(instancetype)autorelease{
    return _instanceType;
}
- (NSUInteger)retainCount{
    return 1;
}
@end
  • 在ARC下示例代码:
#import "NetWorkTools.h"

@implementation NetWorkTools
static id _instanceType = nil;
//自定义类方法
+(instancetype)sharadNetWorkTools{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instanceType = [[self alloc]init];
    });
    return _instanceType;
}
//重写父类方法,防止通过alloc]init或new的方式开辟新空间
+ (instancetype)allocWithZone:(struct _NSZone *)zone{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _instanceType = [super allocWithZone:zone];
    });
    return _instanceType;
}
//防止对象copy操作
-(id)copyWithZone:(NSZone *)zone{
    return _instanceType;
}
@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容