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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 洪吉童 中级黑马   /  2015-10-24 12:01  /  1081 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

OC中并没有像Java或者其他语言中提供的私有方法,OC中的私有,可以理解为相对私有。
OC中私有方法实现有两种方式:
1)方法在.m中实现,不在.h中声明(相对私有)

创建一个类:

[cpp] view plaincopy


  • #import<Foundation/Foundation.h>  
  • @interface Person : NSObject  
  • {  
  • int _age;  
  • NSString *_name;  
  •   
  • }  
  • -(void)run;  
  • -(void)eat;  
  • @end  

实现这个类:

[cpp] view plaincopy


  • #import"Person.h"  
  • @implementation Person  
  • -(void)run{  
  • NSLog(@"人正在走");//可以访问m  
  • }  
  • -(void)eat{  
  • NSLog(@"吃的方法");  
  • }  
  • -void()test{  
  • NSLog(@"我是私有方法");  
  • }  
  • @end  

在main中测试:

[cpp] view plaincopy


  • #import <Foundation/Foundation.h>  
  • #import "Person.h"  
  • int main(int argc, constchar * argv[]) {  
  •     @autoreleasepool {  
  •        Person *per=[Person new];  
  •        [per eat];   //可以使用  
  •        [per run];  //可以使用  
  •        [per test];  //不可以使用  
  •     }  
  •     return 0;  
  • }  


这时候编译器报错,因为test()是私有方法,此文件包含的是#import"Person.h",.h文件可以看做是对外的一个接口,而Person.h中没有声明定义test。当然这个test()也不能被子类继承和使用。那么这个test怎么使用呢?看下面代码:

[cpp] view plaincopy


  • #import"Person.h"  
  • @implementation Person  
  • -(void)run{  
  • NSLog(@"人正在走,速度是%d",m);//可以访问m  
  • }  
  • -(void)eat{  
  • NSLog(@"m=%d",m);  
  • [self test];//可以在本文件的函数中使用  
  • }  
  • -void()test{  
  • NSLog(@"我是私有方法");  
  • }  
  • @end  

也就是说,test只能在本文件中被调用,跟static修饰函数的使用方法很类似。

2)通过匿名类别(延展)实现私有(一般意义上的私有)
[cpp] view plaincopy


  • @interface MyClass {  
  •     // 添加变量  
  • }  
  • - (void)PublicMethod;//公共方法,可以被继承类继承  
  • @end  

而在类的.m文件中,采用类别来实现私有方法,具体操作为:
[cpp] view plaincopy


  • @interface MyClass()//注意(),即定义一个空类别  
  • - (void)PrivateMethod;//在类别中定义私有方法  
  • @end  

关于通过匿名类别实现私有方法目前还没有学到,暂时不做过多说明。

3 个回复

倒序浏览
恩,支持继续更新,好好好
回复 使用道具 举报
私有方法只能本类使用,不能被子类继承。
回复 使用道具 举报
嗯嗯,学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马