Objective-C中,类的实例化变量的范围有@private、@protected、@public。他们代表的意思和C++中相同,只是前面添加了一个@符号。下面介绍一下他们代表的范围:
指令 | 意思 |
@private | 作用范围只能在自身类(实例变量只能被声明它的类访问) |
@protected | 作用范围在自身类和继承自己的子类,什么都不写,默认是此属性(实例变量能被声明它的类和子类访问,所有没有显式制定范围的实例变量都是) |
@public | 作用范围最大,在任何地方(实例变量可以被在任何地方访问) |
@package
| 使用modern运行时,一个@package实例变量在实现这个类的可执行文件镜像中实际上是@public的,但是在外面就是@private(runtime需要再看一下苹果文档Runtime Programming Guide);Objective-C中的@package与C语言中变量和函数的private_extern类似。任何在实现类的镜像之外的代码想使用这个实例变量都会引发link error,这个类型最常用于框架类的实例变量,使用@private太限制,使用@protected或者@public又太开放。 |
下面是一个例子,来说明他们之间的关系:
实现一个Boss类:
#import <Foundation/Foundation.h>
@interface Boss : NSObject
{
@private
int age;
@protected
NSString *job;
}
@end
实现一个Worker类继承Boss类:
#import <Foundation/Foundation.h>
#import "Boss.h"
@interface Worker : Boss
{
NSString *name;
@private
NSString *evaluation;
@protected
float wage;
@public
NSString *boss;
}
- promoteTo:newPosition;
@end
在Worker的.m文件中添加:
#import "Worker.h"
@implementation Worker
- promoteTo:newPosition
{
id old = job;
job = newPosition;
return old;
}
-(NSString *)description
{
return [NSString stringWithFormat:@"Worker name:%@,evaluation:%@,job:%@,wage:%f,boss:%@",name,evaluation,job,wage,boss];
}
@end
如果我们在Worker中调用Boss中的私有变量age,会报错:
但是调用job是没有问题的。
下面在其他类中调用Worker类:
Worker *ceo = [[Worker alloc] init];
ceo->boss = @"XX";
[ceo promoteTo:@"YY"];
NSLog(@">>>=%@",[ceo description]);
运行结果:
但是调用protected的属性会报错:
所以当一些比较重要的属性,不能随便更改的时候,要用private,这样避免其他继承类修改此属性。