属性
//在华括号内声明实例变量
//{
// NSString *_name;
// int _age;
//}
//属性声明在括号外
//@property系统自动生成一套方法 setter getter方法
//@property后面的叫属性 ,而{}叫实例变量。
//属性的作用:自动生成getter setter方法;如果没有和属性对应的实例变量,系统自动帮我们生成这些实例变量(_属性);(系统根据属性自动帮我们生成的实例变量,默认是私有的, 子类不能继承。但是子类可以继承属性)
//对于属性的属性:retain assign copy,系统默认是assign
//对于属性,系统默认帮我们生成setter 和 getter方法,是因为系统默认属性的读写权限时readwrite,如果改成readonly就是只读不能写,也就是只有getter 方法,没有setter方法
@property (nonatomic , retain) NSString *name;
@property (nonatomic , assign) int age;
@property (nonatomic , retain) NSString *gender;//性别
@property (nonatomic , copy) NSString *telephone;
//setter getter方法
//- (void)setName:(NSString *)name;
//- (NSString *)name;
//
//- (void)setAge:(int)age;
//- (int)age;
//
- (instancetype)initWithName:(NSString *)name andAge:(int)age;
+ (instancetype)personWithName:(NSString *)name andAge:(int)age;
Person *p1 = [Person personWithName:@"laingtong" andAge:23];
//当点语法,在赋值符号(=)左边时,相当于把(=)右边的 东西赋值给左边的东西,这时候就相当于setter方法
//当点语法,没有在=左边,在任何位置的时候,都相当于走了getter方法
p1.name = @"jhdk";
//用属性的方式打印name和age,通过点语法
NSLog(@"name:%@ , age:%d" , p1.name , p1.age);
系统setter getter方法
// name的setter getter
- (void)setName:(NSString *)name
{
if (_name != name) {
//对于retain修饰的属性,系统时这样帮我们实现的
//把这个实例变量释放
[_name release];
//
_name = [name retain];
}
}
- (NSString *)name
{
return [_name retain];
}
//age 的setter getter
- (void)setAge:(int)age
{
if (_age != age) {
_age = age;
}
}
- (int)age
{
return _age;
}