Date 日 22 十二月 2013 Tags iOS

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