稍微百度了一下,首页上的答案有两种------他山之玉
一种是在init方法里抛出异常
- (instancetype)init{
[self doesNotRecognizeSelector:_cmd];
return nil;
}
然后构建一个私有的init方法,在里面调用[super init],然后单例实现中就调用私有的init方法!
还有一种是直接在init中返回单例
- (instancetype)init {
return [[self class] sharedInstance];
}
同样的,也是需要构建一个私有的init方法,再在单例中调用私有的init方法!
但是这两种方法都可以正常调用,而且前一种会在你运行的时候才会报错崩掉!所以想要方便省事推荐使用第二种!力求稳妥,推荐使用第一种.
最近在看框架的时候,偶然找到了一个编译器相关的方法
在.h文件中直接声明init方法是不可用的,然后单例实现中改为
+ (instancetype)shareInstance{
static dispatch_once_t once_token;
static ClassA *classA;
dispatch_once(&once_token, ^{
classA = [[[self class]alloc]init];
classA.zf = @"hello";
});
return classA;
}
然后在其他人直接通过类名调用[[Class alloc]init],编译器就会产生警告!编译也会不通过,但是可以通过[[[Class class]alloc]init]进行初始化.
所以这样还是能够获取一个非单例的对象!所以如果想要采用严格的禁用的话,还是采用上面的第一种方式,第一种方式就算通过类名进行alloc然后init也会崩的!
如果想要醒目的提示init方法被禁用了,就可以采用最后的方法