Objective-C 属性(property)*** 点语法
***今天主要学习的内容有 属性@property 点语法是今后我们经常用到的知识点,所以务必要对理解透彻, 不然还得返工的.
//属性:属性是OC定义的语法,为实例变量提供了setter和getter方法的默认实现.能在一定程度上简化程序代码,并且增强实例变量的访问安全性.
#pragma mark --属性--
属性的声明
@property NSString *name; //此方法是下面方法的结合.
- (void)setName:(NSString *)name;//setter方法的声明
- (NSString *)name; //getter方法的声明
属性的实现
@synthesize name = _name; //此方法是下面方法的结合.
- (void)setName:(NSString *)name
{
_name = name; //setter的实现部分
}
- (NSString *)name
{
return _name; //getter的实现部分
}
#pragma mark --属性的属性--
概念: OC提供属性的目的是为了简化程序员编码,为属性提供了一些"关键字"来控制setter,getter的实现细节,这些"关键字"我们成为属性的属性(attribute),(attribute)可以分为3类,我们一一的看一下.
第一类:读写性控制(readonly,readwrite,setter,getter)
readonly,是告诉编译器,只声明getter方法,没有setter方法.例如:
@property(readonly)NSString *name; //等价于下面一个
- (NSString *)name;
readwrite,是告诉编译器,即声明setter又声明getter.例如:
@property(readwrite)NSString *name; //等价于下面两个
- (NSString *)name; //getter的声明
- (void)setName:(NSString *)name; //setter的声明
readwrite是读写性控制的默认设置.
第二类:原子性控制(nonatomic,atomic)
1.atomic: setter,getter方法在多线程访问下是绝对安全的,即setter,getter内部做了多线程访问处理.原子性控制的默认设置是atomic.
2.nonatomic:setter,getter方法内部不会做多线程访问处理,仅仅是不同的setter,getter方法.
程序开发过程中,setter,getter处处都在用,如果使用atomic,需要不断的对setter,getter加锁解锁以保证线程的访问安全,会占用很多系统资源,降低系统性能,所以通常设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic. 通常例子为:
@property (readwrite,nonatomic)NSString *name;//等价于下面2个.
- (NSString *)name;//getter的声明部分
- (void)setName:(NSString *)name;//setter的声明
第三类:语义设置 (assign,retain,copy)
1.assign: setter,getter内部实现直接赋值.例如:
@property(nonatomic,assign)NSInteger *age;//等价于下面
- (NSInteger *)age; //age的getter声明部分
-(NSInteger *)age //age的getter实现部分
{
reture _age;
}
- (void)setAge:(NSInteger *)age; //age的setter声明部分
-(void)setAge:(NSInteger *)age //age的setter实现部分
{
_age = age;
}
2.retain: setter,getter的内部实现会做内存优化.例如:
@property (nonatomic,retain)NSString *name;//等同于下面
- (NSString *)name; //name的getter的声明部分
- (NSString *)name //name的getter的实现部分
{
return [[_name retain]autorelease];
}
- (void)setName:(NSString *)name; //name的setter声明部分
- (void)setName:(NSString *)name //name的setter实现部分
{
if(_name != name){
[_name release];
_name = [name retain];
}
}
3.copy: setter,getter的内部实现也会内存优化.例如:
@property(nonatomic,copy)NSString *name;
- (NSString *)name;//getter的声明
- (NSString *)name //getter的实现
{
return [[_name retain]autorelease];
}
-(void)setName:(NSString *)name; //setter的声明
-(void)setName:(NSString *)name //setter的实现
{
if(_name != name){
[_name release];
_name = [name copy];
}
}
如果属性是非对象类型 (比如NSInteger,CGFloat以及C语言的int,float等)属性的语义设置都会使用assign.
如果属性是对象类型(比如NSString,NSArray等)属性的语义设置都会使用retain.
如果属性是对象类型并且想得到参数的Copy,那么就使用copy关键字.
#pragma mark --点语法--
什么是点语法: 点语法是Objective - C 2.0中定义的语法格式,提供了一种便捷的属性访问方式.
点语法的使用:凡是符合系统默认的setter,getter书写格式的方法都可以使用点方法. 例如:
[person setName:@"zhangSan"];可以等价写成
person.name = @"zhangSan";
NSString *name = [person name];可以等价写成
NSString *name = person.name;
属性是一对getter,setter方法,点语法是属性的另一种调用格式.