新建一个Person类
Person.h
@interface Person : NSObject
属性 property
声明 getter 和 setter 方法.
关键字 类型 属性名
@property NSString *name;
@property NSString *sex;
@property NSInteger age;
@property NSString *hobby;
属性(property)的特性
1.读写性
(1). readonly 只读,只声明一个Getter方法.
@property(readonly) NSString *name;
(2). readwhite(系统默认)可读可写,生命了setter 和getter.
@property(readwrite) NSString *sex;
(3). 在属性中写setter和getter时,注意setter后有冒号,对比标准的setter和getter来理解.
@property(getter=quZhi, setter=fuZhi:)NSInteger age;
这句话的意思是,将原本age的getter和setter方法重新取了两个名字,因为setter方法是设置器,声明和实现该方法时是需要给参数的,所以要带有冒号.
2.原子性(线程安全)
(1). atomic 原子性(系统默认),提供线程加锁和解锁安全.
@property(atomic) NSString *name;
(2). nonatomic 非原子性(常用方法),不需要加锁和解锁.
@property(nonatomic) NSString *sex;
3.语义特性(内存优化)
(1). assign 分配,非对象(系统默认),适用于基本数据类型.
@property(assign) NSUInteger age;
(2). retain 持有,所有对象,适用于对象类型.
@property(retain) NSString *name;
(3). copy 拷贝,符合某些特殊条件的对象.
@property(copy) NSString *sex;
属性常见的例子
@property(nonatomic, retain) NSString *name;
@property(nonatomic, assign) NSUInteger age;
@property(nonatomic, retain) NSString *sex;
@end
Person.m
@implementation Person
属性的实现.
可以不写.
关键字 属性名 = 成员变量(给属性指定操作的成员变量)
@synthesize name = _name;
@synthesize sex = _sex;
@synthesize age = _age;
@synthesize hobby = _hobby;
#pragma mark - Setter & Getter
属性不允许同时重写setter和getter方法,因为属性本身就带有setter和getter方法,否则会报错.
如果就是想让属性和setter & getter 共存, 解决办法有两种:
1. @synthesize, 将属性的实现写出来.
2. 在”.h"文件中声明成员变量(实例变量).
// 属性中的getter和setter方法.
- (NSInteger)age {
return _age;
}
- (void)setAge:(NSInteger)age {
_age = age;
}
// 将上面的getter和setter方法重命名,功能不变.
- (NSInteger)quZhi {
return _age;
}
- (void)fuZhi:(NSInteger)age {
_age = age;
}
main.m
如果只有设置器setter,没有访问器getter,在主函数中可以使用点语法,但是无法获得.
如果只有访问器getter,没有设置器setter,在主函数中不可以使用点语法,也就是无法读取.