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


    私有方法的前向引用

     类别主要有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
  • 相关阅读:
    uni-app 小程序实现scroll-view 横向滑动效果的坑
    kafka常用指令
    vue之每个页面设置单独的title,keywords,description等
    mysql定时备份
    zabbix-mysql备份脚本
    第十五课:企业案例-kubernetes高可用集群架构设计
    第十四课:企业案例-微服务实现业务架构
    第十三课:微服务基本知识-微服务调用及运行过程
    第十二课:微服务基本知识-微服务组件
    第十一课:微服务基本知识-微服务架构与框架介绍
  • 原文地址:https://www.cnblogs.com/stevenwuzheng/p/5457487.html
Copyright © 2020-2023  润新知