众所周知,Objective-C是没有私有方法的概念,成员方法只有两种:类成员方法(+)和对象成员方法(-),这两种都是对外开放的。而本身提供的@private,@protect和@public关键字也仅供成员对象使用而已,比较坑爹。
所以在Objective-C中实现私有成员方法的含义是:创建一个让他人较难调用的方法,而并非实现如C++和JAVA般让非当前类对象无法调用的方法。做法如下:假设我们需要构建一个类叫做AClass,它提供一个公开成员函数publicMethod和一个“私有成员方法”privateMethod,那么在AClass.h文件中我们就有:
@interface AClass : NSObject - (void)publicMethod; @end
而在.m文件中使用一个类拓展:
@interface AClass () - (void)privateMethod; @end @implementation AClass - (void)publicMethod{...} - (void)privateMethod;{...} @end
这样因为privateMethod隐藏于.m中,调用类并不能直接通过.h看到其声明,等于间接实现了私有成员方法。当然网上也有各种教程是使用分类(Categories)而非类拓展,不过相比于分类,使用类拓展有两个明显的好处:
不过正如我一开始所说:因为Objective-C是个动态语言,这也意味你可以发送任何消息给任何一个类对象,而任何一个类对象也可以接受任何方法。如果某个AClass的实例要强行调用privateMethod方法(调用的说法其实不合适,应该说发送消息) ,编译期间是不会有任何error,而运行时也不会有任何问题。但是编译期间会给出一个warning,这个warning的意思是:你个2货,你都声明它是私有方法了却还去调用,有病啊。如果你硬要这么做,后果自负。