实例变量的可见度:一共有三种
@pubic:公共的, 在任何文件中都可以访问(访问方式是通过对象+指向操作符, 例如:per->name
@protected:受保护的, 有一定的访问权限, 只允许在本类文件以及子类中访问, 其他文件不可以访问
@private:私有的, 只允许在本类文件中访问, 不可以在子类文件以及其他文件中访问
默认的可见度是@protected
为什么不声明为@public?
1 声明为@pubic的实例变量, 外部就可以访问以及修改, 会影响内部的一个实现, 暴漏实现细节
2 违背了OC面向对象的三大特性之一-----封装.(封装的思想是隐藏内部的实现, 提供外部访问的接口)
为什么不声明为@private
1 声明为@private的实例变量, 子类文件不能访问, 所以子类文件还要重新定义声明
2 违背了OC面向对象特性之一----继承(父类有的东西, 子类也有, 可访问)
文件和类没有直关系: 文件中可以存放多个类, 只要类符合接口部分和实现部分的定义格式就可以; 一般情况下, 一个文件中就定义一个类, 而且文件的名字和类的名字一样, 这样就能清晰的知道该文件中类的名字
self : 谁调用该方法, self代表谁
当方法是实例方法(-号方法)时, 调用该方法的对象是谁, self就代表当前对象
当方法是类方法(+号方法)时, 调用该方法的类是谁, self就代表当前类
@interface Person : NSObject {
NSString *_name;//姓名
NSInteger _age;//年龄
NSString *_sex;//性别 gender
}
- (void)sayHi;
//设置器 seter方法 (只有一个参数的)-------有多个参数的方法不叫设置器--------------
//为name赋值
- (void)setName:(NSString *)name;
- (void)setAge:(NSInteger)age;
- (void)setSex:(NSString *)sex;
//访问器 getter方法
- (NSString *)name;
- (NSInteger)age;
- (NSString *)sex;
+ (void)test;
//自定义初始化方法
- (id)initWithName:(NSString *)name age:(NSInteger)age sex:(NSString *)sex;
@end
@implementation Person
- (void)sayHi {
NSLog(@"hello iOS, my name is %@, age is %ld, sex is %@", _name, _age, _sex);
}
//设置器(只有一个参数的)
//设置名字
- (void)setName:(NSString *)name {
_name = name;
}
//设置年龄
- (void)setAge:(NSInteger)age {
_age = age;
}
//设置性别
- (void)setSex:(NSString *)sex {
_sex = sex;
}
//访问器
//访问姓名, 将姓名返回
- (NSString *)name {
return _name;//直接将值返回即可
}
//访问年龄, 将年龄返回
- (NSInteger)age {
return _age;
}
//访问性别, 将性别返回
- (NSString *)sex {
return _sex;
}
+ (void)test {
//在类方法(+号方法)中不能使用实例变量, 实例变量是依托对象存在的, 只有有了对象, 实例变量才会有空间
// _name;
}
- (id)initWithName:(NSString *)name age:(NSInteger)age sex:(NSString *)sex {
self = [super init];
if (self != nil) {
_name = name;
_age = age;
_sex = sex;
}
/**
* self : 谁调用该方法, self代表谁
当方法是实例方法(-号方法)时, 调用该方法的对象是谁, self就代表当前对象
当方法是类方法(+号方法)时, 调用该方法的类是谁, self就代表当前类
*/
return self;
}