用类别实现类私有方法的前向引用

私有方法的前向引用

 类别主要有3个作用:

1).将类的实现分散到多个不同文件或多个不同框架中。

2).创建对私有方法的前向引用。

3).向对象添加非正式协议。

 

OC语法中,可以对类的实例变量加@private/@public等关键字进行修饰。但是对于类的方法只分+开头的类方法和-开头的对象方法,不能对一个类的方法加@private这样的关键字进行限定,那么OC中如何定义私有方法呢?

答案是:定义在类名.h文件中的方法/属性一定是公开的,而在类名.m中的类延展(Extension)中定义的方法/属性都是私有的。或者不在任何地方申明,只在类.m中写实现代码的方法也是私有的。

注意:

Cocoa没有任何真正的私有方法。只要知道对象支持的某个方法的名称,即使该对象所在的类的接口中没有该方法的声明,你也可以调用该方法。不过这么做编译器会报错,但是只要新建一个该类的类别,在类别.h文件中写上原始类该方法的声明,类别.m文件中什么也不写,就可以正常调用私有方法了。这就是传说中的私有方法前向引用。 所以说cocoa没有真正的私有方法。

以下通过类延展和不作任何申明2种方式来达到方法私有的目标:

//MyClass.h文件
@interface MyClass
{
// 添加变量
}
- (void)PublicMethod; //公开方法,可在其他类或子类进行访问
@end


//MyClass.m文件
@interface MyClass() //类延展
- (void)PrivateMethod;//在类延展中定义的是私有方法
@end

@implementation MyClass
- (void)PublicMethod //.h中有申明,公开方法
{
}
- (void)PrivateMethod {//类延展中有申明,私有方法
}
- (void)noInterfacePrivateMethod {//不在任何地方申明,私有方法
}

@end

 

以上通过2中手段实现了私有的方法,私有方法不能在其他类或子类中使用,如强制使用,Xcode编译器直接报错Build Failed。如果非要在其他类中调用私有方法,需要给MyClass类添加一个分类(Category),在分类.h中写上该申明,分类.m中不用写实现。在要用的类中同时导入类.h和分类.h即可使用。这就是传说中的私有方法的前向引用。

 

举例应用:

1. 访问类私有方法编译报错

 

2.将分类写在类.h中前向引用相当于直接在类.m中申明该方法(多此一举,基本不用)

 
3. 将分类写在类.m中前向引用无效
 
4. 单独建立分类进行前向引用(正确用法)
 
以上是我理解的前向引用,有偏差的地方欢迎留言指正!
 
posted @ 2016-05-04 10:19  stevenwuzheng  阅读(2115)  评论(0编辑  收藏  举报