新建一个类会生成一个.h声明文件和一个.m实现文件。
在声明文件中未做声明而在实现文件中实现的方法,叫做私有方法。
私有方法不能被子类继承,也不能被子类访问。只能在类实现文件中使用。
探究原因:
现在有Cat和Dog两个类,Cat通过new file-cocoa class方法创建,产生Cat.h 和Cat.m两个文件:
Cat.h
- #import <Foundation/Foundation.h>
- @interface Cat : NSObject
- -(void) eat;
- @end
复制代码
Cat.m
- #import "Cat.h"
- @implementation Cat
- -(void) eat{
- NSLog(@"this is eat");
- }
- -(void) run{
- NSLog(@"this is run");
- }
- @end
复制代码 在Cat这个类中,run方法是一个私有方法。
现在通过在main.m文件中调用Cat类。
- #import <Foundation/Foundation.h>
- #import "Cat.h"
- int main(int argc, const char * argv[]) {
- @autoreleasepool {
- Cat *c = [Cat new];
- [c eat];
- //[c run]; //此处报错
- }
- return 0;
- }
复制代码 在main.m中调用Cat类的私有方法报错。
但是,我们在main.m文件中声明并实现一个Dog类,声明中并不声明run方法,但是在实现时实现这个方法。这个方法还是这个类的私有方法吗?
是否依然不能被调用呢?
- #import <Foundation/Foundation.h>
- @interface Dog : NSObject
- -(void) eat;
- @end
- @implementation Dog
- -(void) eat{
- NSLog(@"this is eat");
- }
- -(void) run{
- NSLog(@"this is run");
- }
- @end
- int main(int argc, const char * argv[]) {
- @autoreleasepool {
- Dog *d = [Dog new];
- [d eat];
- [d run]; //可以被调用,并没有报错。
- }
- return 0;
- }
复制代码 结果是可以被调用。(但这样的run方法还算不算是私有方法我就不清楚了)
所以,私有方法只能找本类的实现文件中被调用的原因应该是:
main.m文件中只引用类的声明文件(cat.h),而私有方法并没有在这个文件中声明。只实现而未声明的方法是不能被调用的,这应该就是私有变量不能在类实现文件意外调用的原因!
|
|