掌握setter、getter的作用及书写格式
- 什么是setter、getter
在OC里,为实例变量赋值的方法称作setter(设置器)
读取实例变量值的方法称作getter(访问器)
我们之前写的那些赋值取值的方法称作setter和getter
- setter、getter的书写格式
OC里规定了setter和getter的书写格式
如果一个实例变量是int age; 或者int _age; setter的书写格式如下:-(void)setAge:(int) age, 即set+首字母大写的实例变量名(忽略下划线)
getter的书写格式如下:-(int)age; 即返回值类型与变量类型一致,方法名与实例变量名相同(忽略下划线)
- setter、getter与实例变量的关系
无论setter还是getter内部操作的是实例变量
每一个实例变量都需要一堆setter和getter方法
掌握setter、getter与实力变量的关系
- 无论setter还是getter内部操作的是实例变量
- 每一个实例变量都需要一堆setter和getter方法
掌握iOS属性的使用
- 属性的声明:使用@property声明属性(例如:@property NSString *name;)
相当于@interface中声明了两个方法:
- (void)setName:(NSString *)name;- (NSString *)name;
- 属性的实现:使用@synthesize实现属性(例如:@synthesize name = _name)
相当于@implementation实现了:
- (void)setName:(NSString *)name;- (NSString *)name;
掌握属性的Attribute
- OC提供属性的目的是为了简化程序员编码
为属性提供了一些关键字以控制setter、getter的实现细节
这些关键字我们可以成为属性的属性(attribute)
一共3大类attribute:
- 属性的3大类:
第一类:读写性控制(readonly、readwrite、setter、getter)
如果读写性控制的关键字是readonly,是告诉编译器,只声明getter方法(无setter方法),例如:@property (readonly) NSString *name; // 等价于- (NSString *) name;
如果是readwrite,告诉编译器,既声明setter又声明getter。例如:@property(readwrite) NSString *name; // 等价于- (NSString *)name;- (void)setName:(NSString *) name; readWrite是读写性的默认设置
第二类:原子性控制(nonatomic、atomic)
如果原子性的关键字是atomic。setter、getter方法在多线程访问下是绝对安全的,即setter、getter内部做了多线程访问处理。原子性控制的默认设置是atomic
如果原子性控制的关键字是nonatomic。setter、getter方法内部不会做多线程访问处理,仅仅是普通得setter、getter方法
在原子性控制上,我们通常使用nonatomic
程序开发过程中,setter、getter处处都在用,如果使用atomic,需要不断的对setter、getter加锁解锁以保证线程访问安全,会很占用系统资源,降低系统性能
同城设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic
例如:@property (readwrite, nonatomic) NSString *name; // 等价于 - (NSString *) name; - (void)abc:(NSString *) name;
第三类:语义设置(assign、retain、copy)
如果语义设置的关键字是assign。setter、getter内部实现是直接赋值
例如:@property (nonatomic, assign) NSString *name;
- (void) setName:(NSString *) name {_name = name};
- (NSString *)name {return _name};
在如果语义设置的关键字是retain。setter、getter的内部实现会做内存优化
例如:@property(nonatomic, retain) NSString *name;
- (void)setName:(NSString *) name {
};
- (void)setName:(NSString*)name {
if (_name != name) { [_name release]; _name = [name retain]; } }
- (NSString
*)name {
return _name; }
如果语义设置的关键字是copy。setter、getter的内部实现也会做内存优化。
例如: @property( nonatomic , copy ) NSString *name; - (void)setName:(NSString
*)name {
if (_name != name) { [_name release]; _name = [name copy]; } }
- (NSString
*)name {
return [[_name retain] autorelease]; }
如果属性是基本数据类型(比如int, float等)属性的语义设置使用assign
如果属性是对象类型(比如NSString、NSArray等)属性的语义设置使用retain
如果属性是对象类型并且想得到参数copy,使用copy关键字
掌握OC点语法
- 点语法是Objectice-C 2.0中定义的语法格式。提供了一种便捷的属性访问方式
- 凡是符合系统默认的setter、getter书写格式的方法都可以使用点语法
- 例如:
[person setName:@"小七"]; 等价于:person.name = @"小七";
NSString *name = [person name]; 等价于:NSString *name = person.name;
- 属性是getter、setter方法,点语法是属性的另一种调用格式。
属性是Objective-C的重要语法,属性是一组getter、setter方法,内部对实例变量进行操作。点语法是一种属性的另外一种调用格式。