转载自: http://www.open-open.com/lib/view/open1326155291578.html
Objective-C中,类的实例化变量的范围有@private、@protected、@public。他们代表的意思和C++中相同,只是前面添加了一个@符号。下面介绍一下他们代表的范围:
指令 | 意思 |
@private | 作用范围只能在自身类 |
@protected | 作用范围在自身类和继承自己的子类,什么都不写,默认是此属性。 |
@public | 作用范围最大,在任何地方 |
下面是官方的图:
下面是一个例子,来说明他们之间的关系:
实现一个Boss类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
#import
<foundation foundation.h=
""
>
<span
class
=
"referer"
>@interface</span> Boss : NSObject
{
<span
class
=
"referer"
>@
private
</span>
int
age;
@
protected
NSString *job;
}
@end
</foundation>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
#import
<foundation foundation.h=
""
>
#import "Boss.h"
<span
class
=
"referer"
>@interface</span> Worker : Boss
{
NSString *name;
<span
class
=
"referer"
>@
private
</span> NSString *evaluation;
@
protected
float
wage;
<span
class
=
"referer"
>@
public
</span> NSString *boss;
}
- promoteTo:newPosition;
@end
</foundation>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#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类:
1
2
3
4
|
Worker *ceo = [[Worker alloc] init];
ceo->boss = @
"XX"
;
[ceo promoteTo:@
"YY"
];
NSLog(@
">>>=%@"
,[ceo description]);
|
运行结果:
但是调用protected的属性会报错:
所以当一些比较重要的属性,不能随便更改的时候,要用private,这样避免其他继承类修改此属性。