黑马程序员技术交流社区

标题: OC中没有私有方法吗? [打印本页]

作者: ⒈心只霸占沵    时间: 2014-5-22 21:33
标题: OC中没有私有方法吗?
  1. @interface Controller : NSObject { NSString *something; }

  2. + (void)thisIsAStaticMethod;

  3. – (void)thisIsAnInstanceMethod;

  4. @end

  5. @interface Controller (private) -

  6. (void)thisIsAPrivateMethod;

  7. @end

复制代码

OC中没有私有方法吗?
作者: wanzhu159    时间: 2014-5-22 23:21
有,不在.h文件里声明,直接在.m文件里是实现的方法就是私有方法。
作者: Guardian_Angel    时间: 2014-5-23 02:50
1.oc中的私有方法只是向调用者隐藏方法,而不是真正的私有方法
2.编译照样能通过,调用照样可以run,只不过会有编译warning (oc是一个动态的语言)

两种方式:
1.通过category
(1)在.m文件中定义一个名为Private的category,在category里声明私有方法
(2)在.m文件种实现私有方法

2.通过类扩展
(1)在.m文件中定义一个类扩展
(2)在主类的implement段中实现它
作者: ⒈心只霸占沵    时间: 2014-5-23 20:40
wanzhu159 发表于 2014-5-22 23:21
有,不在.h文件里声明,直接在.m文件里是实现的方法就是私有方法。

编译应该会报警告吧?
作者: ⒈心只霸占沵    时间: 2014-5-23 20:43
Guardian_Angel 发表于 2014-5-23 02:50
1.oc中的私有方法只是向调用者隐藏方法,而不是真正的私有方法
2.编译照样能通过,调用照样可以run,只不过 ...

OC中可以定义私有方法吗?我看视频,老师说OC中没有私有方法
作者: wanzhu159    时间: 2014-5-23 21:02
我也不知道,目前没遇到过。其实其它面向对象语言比如C++和Java的区别是 OC里面的方法没有公有、私有等权限这一说法,意思是不能够显示的将方法声明为 私有或者其它权限,但是OC有一个相对私有的概念,就是不在头文件中声明,只在实现文件中实现,这样基本就保证了定义的这样一种方法只能够在当前类中使用,而基本不会被子类调用。为什么都是说基本?其实子类还是看能够调用这个相对私有的只在类的实现文件中定义的方法的,但前提是要求调用者知道那个未被声明的方法的方法名,意思就是可以访问,但是有一定门槛。 OC的子类能够继承父类除了私有变量以外的所有东西。
作者: Jony.Lee    时间: 2014-5-24 00:34
有私有方法,板凳哪里说得对,可以使用类扩展去声明
作者: Guardian_Angel    时间: 2014-5-24 03:01
⒈心只霸占沵 发表于 2014-5-23 20:43
OC中可以定义私有方法吗?我看视频,老师说OC中没有私有方法

盗版的,伪私有。。
作者: 大龄产妇    时间: 2014-7-23 21:30
突然间就想起你这个问题了,OC中有私有方法。
具体如何实现,这就是category范畴内的。
按照李明杰说的就是分类,其实不新创建一个分类也可以实现分类。
其实应该叫做类别,很多书都这么说。类别在原类的基础上可以实现对类的扩充。
类别分有名类别和匿名类别,有名类别为原类扩充方法,匿名类别则可以为类扩充成员变量和方法。
具体实现:
在任意一个类的.m文件中
@interface Student()  <--------括号中无内容为匿名类别,只能扩充私有方法和成员变量,供类内使用。
//{
//    //扩展了一个成员变量
//    double _score;
//}
@property (nonatomic,assign) double score;
//扩展一个类方法
+(Student *)createStudent;
//扩展一个对象方法
-(void)showNoAndAgeAndScore;
@end

@implementation Student
//显示学生学号和姓名
-(void)showNoAndAge
{
    [Student createStudent];
    self.score = 1000;
    self.no = 10;
   
    NSLog(@"学号:%lu 年龄:%lu",_no,_age);
    //这样访问是可以的,因为是私有的方法
    [self showNoAndAgeAndScore];
}

作者: fantacyleo    时间: 2014-7-23 21:42
Guardian_Angel 发表于 2014-5-23 02:50
1.oc中的私有方法只是向调用者隐藏方法,而不是真正的私有方法
2.编译照样能通过,调用照样可以run,只不过 ...

貌似class extension中声明的方法,在类文件范围之外是调用不了的
作者: zhuohong_xiao    时间: 2014-12-6 12:51
wanzhu159 发表于 2014-5-22 23:21
有,不在.h文件里声明,直接在.m文件里是实现的方法就是私有方法。

你确定这样做了?
我是没有通过的。直接报错。
作者: zhuohong_xiao    时间: 2014-12-6 12:56
⒈心只霸占沵 发表于 2014-5-23 20:40
编译应该会报警告吧?

直接报错
作者: zhuohong_xiao    时间: 2014-12-6 12:58
wanzhu159 发表于 2014-5-23 21:02
我也不知道,目前没遇到过。其实其它面向对象语言比如C++和Java的区别是 OC里面的方法没有公有、私有等权限 ...

在分文件开发的时候。我这么做了。没有用。直接报错
作者: 枫煠    时间: 2014-12-7 02:01
本帖最后由 枫煠 于 2014-12-7 02:05 编辑
  1. //
  2. //  TestClass.m
  3. //  test1
  4. //
  5. //

  6. #import "TestClass.h"

  7. @interface TestClass()
  8. -(void) funA;
  9. @end

  10. @implementation TestClass
  11. -(void) funA{
  12.    
  13. }

  14. -(void) funB{
  15.    
  16. }
  17. @end
复制代码

funA需要宣告的话,要在@interface里面宣告funB不宣告也没关系,在TestClass是认得此方法的
这两个方法都是私有





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