OC中提供了4个访问控制符:@private @package @protected @public。
@private(当前类访问权限):成员只能在当前类内部可以访问,在类实现部分定义的成员变量相当于默认使用了这种访问权限。
@package(同映像访问权限):成员可以在当前类或和当前类实现的同一映像中使用。同一映像就是编译后生成的同一框架或同一个执行文件。
@protected(子类访问权限):成员可以在当前类和当前类的子类中访问。在类接口部分定义的成员变量默认是这种访问权限。
@public(公共访问权限):成员可以在任意地方访问。
|
@private
|
@package
|
@protected
|
@public
|
同一个类中
|
|
|
|
|
同一个映像中
|
|
|
|
|
子类中
|
|
|
|
|
全局范围
|
|
|
|
|
下面使用@private来实现Person类,用来封装Person的2个属性,并将方法暴露出来:
#import <Foundation/Foundation.h>
@interface Person : NSObject{
//使用@private限制成员变量
@private
NSString* _name;
int _age;
}
//声明_name的set方法
-(void)setName:(NSString*)name;
//声明_name的get方法
-(NSString*)name;
//声明_age的set方法
-(void)setAge:(int)age;
//声明_age的get方法
-(int)age;
@end
#import "Person.h"
@implementation Person
//声明_name的set方法
-(void)setName:(NSString*)name{
_name = name;
}
//声明_name的get方法
-(NSString*)name{
return _name;
}
//声明_age的set方法
-(void)setAge:(int)age{
_age = age;
}
//声明_age的get方法
-(int)age{
return _age;
}
@end
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person* person = [[Person alloc]init];
//报错,age已经被封装起来,对外不可见
//person->_age = 10;
[person setAge:10];
NSLog(@"age:%d",[person age]);
}
return 0;
}