A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑白世界 中级黑马   /  2015-10-12 23:40  /  939 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

新建一个类会生成一个.h声明文件和一个.m实现文件。
在声明文件中未做声明而在实现文件中实现的方法,叫做私有方法。
私有方法不能被子类继承,也不能被子类访问。只能在类实现文件中使用。
探究原因:
现在有Cat和Dog两个类,Cat通过new file-cocoa class方法创建,产生Cat.h 和Cat.m两个文件:
Cat.h
  1. #import <Foundation/Foundation.h>

  2. @interface Cat : NSObject
  3. -(void) eat;
  4. @end
复制代码

Cat.m
  1. #import "Cat.h"

  2. @implementation Cat
  3. -(void) eat{
  4.     NSLog(@"this is eat");
  5. }
  6. -(void) run{
  7.     NSLog(@"this is run");
  8. }
  9. @end
复制代码
在Cat这个类中,run方法是一个私有方法。
现在通过在main.m文件中调用Cat类。
  1. #import <Foundation/Foundation.h>
  2. #import "Cat.h"
  3. int main(int argc, const char * argv[]) {
  4.     @autoreleasepool {
  5.         Cat *c = [Cat new];
  6.         [c eat];
  7.         //[c run];  //此处报错
  8. }
  9.     return 0;
  10. }
复制代码
在main.m中调用Cat类的私有方法报错。
但是,我们在main.m文件中声明并实现一个Dog类,声明中并不声明run方法,但是在实现时实现这个方法。这个方法还是这个类的私有方法吗?
是否依然不能被调用呢?
  1. #import <Foundation/Foundation.h>

  2. @interface Dog : NSObject
  3. -(void) eat;
  4. @end

  5. @implementation Dog
  6. -(void) eat{
  7.     NSLog(@"this is eat");
  8. }
  9. -(void) run{
  10.     NSLog(@"this is run");
  11. }
  12. @end

  13. int main(int argc, const char * argv[]) {
  14.     @autoreleasepool {
  15.         Dog *d = [Dog new];
  16.         [d eat];
  17.         [d run];  //可以被调用,并没有报错。
  18.     }
  19.     return 0;
  20. }
复制代码
结果是可以被调用。(但这样的run方法还算不算是私有方法我就不清楚了)
所以,私有方法只能找本类的实现文件中被调用的原因应该是:
main.m文件中只引用类的声明文件(cat.h),而私有方法并没有在这个文件中声明。只实现而未声明的方法是不能被调用的,这应该就是私有变量不能在类实现文件意外调用的原因!



5 个回复

倒序浏览
这个应该不是私有的吧,至少在实现结果能被调用上说明了这一点.
回复 使用道具 举报
faceseagod 发表于 2015-10-14 09:34
这个应该不是私有的吧,至少在实现结果能被调用上说明了这一点.

后来又查了查资料,说OC中其实并不存在真正严格以意义上的私有方法。只是在一定层面隐藏了为声明的方法。
回复 使用道具 举报
支持一下啊 总结不错
回复 使用道具 举报
相对私有,完全私有
回复 使用道具 举报
jing397 发表于 2015-10-14 11:55
支持一下啊 总结不错

谢谢谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马