---恢复内容开始---
属性是Objective-C 2.0定义的语法,为实例变量提供了setter、
getter⽅方法的默认实现
能在⼀一定程度上简化程序代码,并且增强实例变量的访问安全性。
NSString *_name;
@property NSString *name;
//相当于下面的两行代码
//- (void)setName:(NSString *)name;
//- (NSString *)name;
第⼀一类:读写性控制(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⽅方法
程序开发过程中,setter、getter处处都在⽤用,如果使⽤用atomic,需要不断 的对setter、getter加锁解锁以保证线程访问安全,会很占⽤用系统资源,降低
系统性能。 通常设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic。
例如:@property (readwrite,nonatomic)NSString *name;
//等价于
- (NSString *)name;
- (void)setName:(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{
if(_name != name){
[_name release];
_name = [name retain];
}
}- (NSString *)name{
return [[_name retain]autorelease];
}
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。 如果属性是对象类型(⽐比如NSStrng、NSArray等)属性的语义设
置使⽤用retain。 如果属性是对象类型并且想得到参数的copy,使⽤用copy关键字。
KVC
Student *stu = [[Student alloc] init];
[stu setValue:@"anhao" forKey:@"_name" ];
NSLog(@"%@",stu.name);
---恢复内容结束---