zoukankan      html  css  js  c++  java
  • 用类别实现类私有方法的前向引用

    私有方法的前向引用

     类别主要有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. 单独建立分类进行前向引用(正确用法)
     
    以上是我理解的前向引用,有偏差的地方欢迎留言指正!
     
    iOS开发者交流群:180080550
  • 相关阅读:
    iOS 8 UIAlertController 和 UIAlertAction
    iOS 利用异常 NSException 调试代码
    iOS 开发 atomic 与 nonatomic 区别
    iOS 9 HTTPS 的配置
    关于Frame加背景的那点事?
    java thread 线程锁同步,锁,通信
    java反射机制
    Java序列化与反序列化
    Java内存分配以及GC
    JavaBean入门笔记
  • 原文地址:https://www.cnblogs.com/stevenwuzheng/p/5457487.html
Copyright © 2011-2022 走看看