用类别实现类私有方法的前向引用
私有方法的前向引用
类别主要有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中前向引用无效
![](https://images2015.cnblogs.com/blog/762733/201605/762733-20160504101637466-346434698.png)
4. 单独建立分类进行前向引用(正确用法)
![](https://images2015.cnblogs.com/blog/762733/201605/762733-20160504101710747-1562533624.png)
以上是我理解的前向引用,有偏差的地方欢迎留言指正!
iOS开发者交流群:180080550