zoukankan      html  css  js  c++  java
  • ObjectiveC中“私有成员方法”的实现

    没有跟java C++中的那种绝对的私有及保护成员方法  在此仅仅只是对调用的用户隐藏方法而已
    转自:http://www.xiangwangfeng.com/2011/11/13/objective-c中私有成员方法的实现/
    众所周知,Objective-C是没有私有方法的概念,成员方法只有两种:类成员方法(+)和对象成员方法(-),这两种都是对外开放的。而本身提供的@private,@protect和@public关键字也仅供成员对象使用而已,比较坑爹。

            所以在Objective-C中实现私有成员方法的含义是:创建一个让他人较难调用的方法,而并非实现如C++和JAVA般让非当前类对象无法调用的方 法。做法如下:假设我们需要构建一个类叫做AClass,它提供一个公开成员函数publicMethod和一个“私有成员方 法”privateMethod,那么在AClass.h文件中我们就有:

    1 @interface AClass : NSObject
    2 - (void)publicMethod;
    3 @end

    而在.m文件中使用一个类拓展

    1 @interface AClass ()
    2 - (void)privateMethod;
    3 @end
    4  
    5 @implementation AClass
    6 - (void)publicMethod{...}
    7 - (void)privateMethod;{...}
    8 @end

    这样因为privateMethod隐藏于.m中,调用类并不能直接通过.h看到其声明,等于间接实现了私有成员方法。当然网上也有各种教程是使用分类(Categories)而非类拓展,不过相比于分类,使用类拓展有两个明显的好处:

            1.类拓展声明的方法必须放在类的主implementation区间中实现,这样可以消除因为使用有名分类(拓展基本等同于一个匿名分类)而产生不必要的N个implementation段。

            2.如果在类拓展中声明的类没有实现,编译器会给出相应的warning,而分类则没有这个便利。

            不过正如我一开始所说:因为Objective-C是个动态语言,这也意味你可以发送任何消息给任何一个类对象,而任何一个类对象也可以接受任何方法。如 果某个AClass的实例要强行调用privateMethod方法(调用的说法其实不合适,应该说发送消息) ,编译期间是不会有任何error,而运行时也不会有任何问题。但是编译期间会给出一个warning,这个warning的意思是:你个2货,你都声明 它是私有方法了却还去调用,有病啊。如果你硬要这么做,后果自负。


  • 相关阅读:
    根据修改时间来获取文件
    juery学习总结——例子
    juery实现贪吃蛇的游戏
    juery学习总结(二)——juery操作页面元素
    juery学习总结(一)——juery选择器
    装饰器
    58同城招聘_爬虫解码ncs--#&X
    断点调试_PDB
    Nginx入门
    Windows环境下nginx的安装
  • 原文地址:https://www.cnblogs.com/cnsec/p/11515882.html
Copyright © 2011-2022 走看看