iOS中屏蔽父类方法
iOS开发中,有时你可能希望屏蔽一些父类的方法,比如说对于单例类,你不希望别人再通过
[[Class alloc]init]
的方式再次创建一个对象。类似JAVA语言中,可以通过覆盖父类的方法,改为private即可使外部无法访问到此方法,那么iOS中如何操作呢?
首先对于Objective-C来说,父类的方法永远是对外可见的。换句话说,不可能达到类似JAVA那种的完全的屏蔽一个方法。但是,我们可以通过如下办法来变相达到:
对于任意的对象,其自身都有一个doesNotRecognizeSelector方法,当调用时会抛出异常(可以变相的让类不响应此消息)。 所以,我们可以在类似init这种地方,使用:
- (id)init {
[self doesNotRecognizeSelector:@selector(init)];
return nil;
}
从而在运行时调用此方法时,由于不响应此消息而报错。
你也可以使用断言,或自己的打印来给予其他开发者更多的提示,比如下面这样:
- (id)init {
NSAssert(false,@"this method not available !")];
return nil;
}
---若转载请注明出处- YueRuo's Blog - http://yueruo.github.io ---
最后,给出一个完整的单例
的小demo,并且禁用外部调用init方法来对类进行实例化,假设类名位YRDemoClass。
@implementation YRDemoClass
static YRDemoClass *instance=nil;
+(YRDemoClass *)shareDemoClass{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if (!instance) {
instance=[[YRDemoClass alloc]initBySuper];
}
});
return instance;
}
- (id)init {//禁用外部可见的init方法
NSAssert(false,@"this class is Singleton !")];
return nil;
}
-(id)initBySuper{//外部不可见的方法
if (self=[super init]) {
//your custom init
}
return self;
}
//其他的方法等等
@end
Comments
comments powered by Disqus