所谓的封装, 就是只暴露出用户需要使用的细节, 用户关心的接口,而具体的实现细节则屏蔽在代码中, 不应该让用户了解
1)setter方法(设置器)
语法:
1, 实例变量一般语法格式为 类型 _变量名;
2, setter 方法的方法名一般为 set变量名,而且使用骆驼命名规则
如:
NSString *_name; //实例变量
setName;
3, setter 方法没有返回值, 但是需要带有一个参数,并且该参数就是需要设置实例变量的数据
如:
NSString *_name;
- (void)setName:(NSString *)name;//set方法的声明
4, 方法体一般就是为实例变量赋值,允许带上筛选条件
Set方法的好处:
(1)不让数据暴露在外,保证了数据的安全性
(2)对设置的数据进行过滤
setter方法的声明
@interface Person : NSObject {
NSString *_name;
int _age;
NSString *_gender;
}
// 为每一个实例变量, 提供一个 setter 方法
- (void)setName:(NSString *)name;
- (void)setAge:(int)age;
- (void)setGender:(NSString *)gender;
@end
setter方法的实现
@implementation Person
- (void)setName:(NSString *)name {
// 直接为实例变量进行赋值
_name = name;
}
- (void)setAge:(int)age {
// 在约束条件满足的情况下, 允许赋值
if (age >= 18) {
_age = age;
}
// 没有赋值的时候, 默认是 0
}
- (void)setGender:(NSString *)gender {
// 在特定条件下, 允许赋值, 接受各种喜好
// _gender = gender;
if ([gender isEqualToString:@"男"] || [gender isEqualToString:@"女"]) {
_gender = gender;
}
}
@end
Get方法的作用:为调用者返回对象内部的成员变量
命名规范:
(1)一定有返回值,返回值的类型和成员变量的类型一致
(2)方法名和成员变量名一样
(3)不需要接收任何参数
getter 的声明
@interface Person : NSObject {
NSString *_name;
int _age;
NSString *_gender;
}
// 为每一个实例变量 提供 getter 方法
- (NSString *)name;
- (int)age;
- (NSString *)gender;
@end
getter的实现
@implementation Person
// getter 方法的具体实现
- (NSString *)name {
return _name;
}
- (int)age {
return _age;
}
- (NSString *)gender {
return _gender;
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [[Person alloc] init];
[p setName:@"张三"];
[p setAge:19];
[p setGender:@"男"];
// 通过 getter 访问实例变量
NSLog(@"姓名是 %@", [p name]);
NSLog(@"年龄是 %d", [p age]);
NSLog(@"性别是 %@", [p gender]);
// NSLog(@"姓名是 %@ 年龄是 %d 性别是 %@", [p name], [p age], [p gender]);
}
return 0;
}
运行结果如下:
2015-08-04 16:24:32.527 12-实例变量的封装-getter 方法[666:48906] 姓名是 张三
2015-08-04 16:24:32.528 12-实例变量的封装-getter 方法[666:48906] 年龄是 19
2015-08-04 16:24:32.528 12-实例变量的封装-getter 方法[666:48906] 性别是 男
所以在开发过程中,考虑到安全性要求,我们一般不在成员变量名前面使用@public、 @protected等键字修饰,而是使用Set方法来为对象