黑马程序员——OC语言日志——私有变量和私有方法

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、OC中的私有变量

在类的实现即.m @implementation中也可以声明成员变量,但是因为在其他文件中通常都只是包含头文件而不会包含实现文件,所以在.m文件中声明的成员变量是@private的。在.m中定义的成员变量不能和它的头文件.h中的成员变量同名,在这期间使用@public等关键字也是徒劳的。
声明一个类:

#import<Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;//默认是protect类型,能在当前类和子类中使用
@private
NSString *_name//_name不能在子类中使用,但是可以被子类继承
}
-(void)run;
-(void)eat;
@end
类的实现:

#import"Person.h"
//在.m中定义实例变量
//纯属私有变量,该变量只能在类中使用,不能被子类继承,也不能被子类使用
int m=100;
@implementation Person
-(void)run{
NSLog(@"人正在走,速度是%d",m);//可以访问m
}
-(void)eat{
NSLog(@"m=%d",m);//可以访问m
}
main实现:

<pre name="code" class="cpp"><p><pre name="code" class="cpp">#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, constchar * argv[]) {
    @autoreleasepool {
       Person *per=[Person new];
       [per eat];   //<span style="font-family: Arial, Helvetica, sans-serif;">可以访问m</span>
       [per run];
       
    }
    return 0;
}


 
 在累的实现代码中定义的m就是一个私有变量,该变量只能在该类中使用,不能被子类继承,也不能被子类使用。下面测试一下 

创建一个继承类Student

#import<Foundation/Foundation.h>
@interface Student : Person
{
}
-(void)run;
@end

实现这个继承类:

#import"Student.h"
@implementation Student
-(void)run{
NSLog(@"人正在走,速度是%d",m);//此处报错,Person类.m中定义的变量不能在此处使用
}
这个继承类的对象方法中使用了其父类中的私有变量m,编译器报错。

二、OC中的私有(相对私有)方法

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

创建一个类:

#import<Foundation/Foundation.h>
@interface Person : NSObject
{
int _age;
NSString *_name;

}
-(void)run;
-(void)eat;
@end
实现这个类:

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

#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怎么使用呢?看下面代码:

#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)通过匿名类别(延展)实现私有(一般意义上的私有)
@interface MyClass {
    // 添加变量
}
- (void)PublicMethod;//公共方法,可以被继承类继承
@end
而在类的.m文件中,采用类别来实现私有方法,具体操作为:
@interface MyClass()//注意(),即定义一个空类别
- (void)PrivateMethod;//在类别中定义私有方法
@end
关于通过匿名类别实现私有方法目前还没有学到,暂时不做过多说明。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值