/*
1>
私有属性:被@private修饰的属性,叫做私有属性.
私有属性的访问权限:
在当前类/子类的外部:不可以通过对象名->_属性名访问,但可以通过setter和getter方法访问;
在当前类的内部:可以通过_属性名访问,也可以通过setter和getter方法访问;
在当前子类的内部:不可以通过_属性名访问,但可以通过setter和getter方法访问;
2>
真私有属性:定义在@implementation中的属性叫做真私有属性.
真私有属性的访问权限:与私有属性的访问热权限相同;
在当前类/子类的外部:不可以通过对象名->_属性名访问,但可以通过setter和getter方法访问;
在当前类的内部:可以通过_属性名访问,也可以通过setter和getter方法访问;
在当前子类的内部:不可以通过_属性名访问,但可以通过setter和getter方法访问;
区别在于:私有属性在无权访问的地方在Xcode中系统会有提示;而真私有属性连提示都不会有.
私有属性和真私有属性子类不可以直接访问,但是可以通过setter和getter方法访问.
子类可以继承私有属性和真私有属性.
*/
#import <Foundation/Foundation.h>
#pragma mark -
#pragma mark 人类的创建
//声明
@interface YYPerson : NSObject
{
@private
NSString *_name;
int _age;
}
- (void)setName:(NSString *)name;
- (NSString *)name;
- (void)setAge:(int)age;
- (int)age;
- (void)setBadHabit:(NSString *)badHabit;
- (NSString *)badHabit;
- (void)sayHi;
@end
//实现
@implementation YYPerson
{
NSString *_badHabit;//定义在@implementation中的属性为真私有属性.
}
- (void)setName:(NSString *)name
{
_name = name;
}
- (NSString *)name
{
return _name;
}
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
return _age;
}
- (void)setBadHabit:(NSString *)badHabit
{
_badHabit = badHabit;
}
- (NSString *)badHabit
{
return _badHabit;
}
- (void)sayHi
{
NSLog(@"大家好,我叫%@,今年%d岁了.我有一个嗜好是%@,非常抱歉!", _name, _age, _badHabit);
}
@end
#pragma mark -
#pragma mark 学生类的创建
//子类可以继承父类的私有属性
//声明
@interface YYStudent : YYPerson
@end
//实现
@implementation YYStudent
@end
int main(int argc, const char * argv[]) {
//创建人对象
YYPerson *xiaoming = [YYPerson new];
//赋值属性:在当前类的外部:不可以通过对象名->_属性名访问,但Xcode会进行提示.
[xiaoming setName:@"小明"];
[xiaoming setAge:18];
[xiaoming setBadHabit:@"吸烟"];//此属性为真私有属性Xcode不会进行提示.
//调用方法
[xiaoming sayHi];
//创建学生对象
YYStudent *xiaoqiang = [YYStudent new];
//赋值属性:在当前子类的外部:不可以通过对象名->_属性名访问,但Xcode会进行提示.
[xiaoqiang setName:@"小强"];
[xiaoqiang setAge:16];
[xiaoqiang setBadHabit:@"喝酒"];//此属性为真私有属性Xcode不会进行提示.
//调用方法
[xiaoqiang sayHi];
return 0;
}