属性

---恢复内容开始---

属性Objective-C 2.0定义的语法,为实例变量提供了setter

getter⽅方法的默认实现 

 

能在⼀一定程度上简化程序代码,并且增强实例变量的访问安全性。 

NSString *_name;

@property NSString *name;

//相当于下面的两行代码

//- (void)setName:(NSString *)name;

//- (NSString *)name;

 

第⼀一类:读写性控制(readonlyreadwritesettergetter)

readonly,告诉编译器,只声明getter⽅方法(⽆无setter⽅方法)。
 例如:@property(readonly)NSString *name;

//等价于 - (NSString *)name;

readwrite,告诉编译器,既声明setter⼜又声明getter
 例如: @property(readwrite)NSString *name;

//等价于 - (NSString *)name;

- (void)setName:(NSString *)name;

readwrite是读写性控制的默认设置。

第⼆二类:原⼦子性控制(nonatomicatomic)

atomicsettergetter⽅方法在多线程访问下是绝对安全的,即 settergetter内部做了多线程访问处理。原⼦子性控制的默认设置是 atomic

nonatomicsettergetter⽅方法内部不会做多线程访问处理,仅仅是 普通的settergetter⽅方法

程序开发过程中,settergetter处处都在⽤用,如果使⽤用atomic,需要不断 的对settergetter加锁解锁以保证线程访问安全,会很占⽤用系统资源,降低

系统性能。 通常设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic

例如:@property (readwrite,nonatomic)NSString *name;
 //等价于

- (NSString *)name;

- (void)setName:(NSString *)name;

第三类:语义设置(assignretaincopy)

assignsettergetter内部实现是直接赋值。

例如:@property(nonatomic,assign)NSString *name;
 - (void)setName:(NSString *)name{

_name = name;
 }

- (NSString *)name{
 return _name;

}

retainsettergetter的内部实现会做内存优化。

例如:@property(nonatomic,retain)NSString *name;

- (void)setName:(NSString *)name{
 if(_name != name){

[_name release];

_name = [name retain];
 }

}- (NSString *)name{

return [[_name retain]autorelease];

} 

 

copysettergetter的内部实现也会做内存优化。

例如:@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。 如果属性是对象类型(⽐比如NSStrngNSArray等)属性的语义设

置使⽤用retain。 如果属性是对象类型并且想得到参数的copy,使⽤用copy关键字。 

 

 

KVC

    Student *stu = [[Student alloc] init];

    [stu setValue:@"anhao" forKey:@"_name" ];

 

    NSLog(@"%@",stu.name);

 

 

---恢复内容结束---

On the road。。。
原文地址:https://www.cnblogs.com/ianhao/p/4424007.html