黑马程序员技术交流社区

标题: 日课25 OC中的私有方法测试 [打印本页]

作者: 黑白世界    时间: 2015-10-12 23:40
标题: 日课25 OC中的私有方法测试
新建一个类会生成一个.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),而私有方法并没有在这个文件中声明。只实现而未声明的方法是不能被调用的,这应该就是私有变量不能在类实现文件意外调用的原因!




作者: faceseagod    时间: 2015-10-14 09:34
这个应该不是私有的吧,至少在实现结果能被调用上说明了这一点.
作者: 黑白世界    时间: 2015-10-14 11:52
faceseagod 发表于 2015-10-14 09:34
这个应该不是私有的吧,至少在实现结果能被调用上说明了这一点.

后来又查了查资料,说OC中其实并不存在真正严格以意义上的私有方法。只是在一定层面隐藏了为声明的方法。
作者: jing397    时间: 2015-10-14 11:55
支持一下啊 总结不错
作者: wwf707542865    时间: 2015-10-14 22:37
相对私有,完全私有
作者: 黑白世界    时间: 2015-10-15 09:54
jing397 发表于 2015-10-14 11:55
支持一下啊 总结不错

谢谢谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2