ios私有方法

没有跟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货,你都声明 它是私有方法了却还去调用,有病啊。如果你硬要这么做,后果自负。

posted @ 2014-07-21 11:25  WFApple  阅读(727)  评论(0编辑  收藏  举报