ObjecticeC之属性

  属性通过所谓的访问器方法,即访问信息的方法,将类变量和方法公开给外部使用(getter ,setter)。使用属性比使用手动构建的方法更有优势,包括点表示法和内存管理。

@interface Car : NSObject
{
    int year; //类变量
NSString *make;
NSString *model;
NSArray *colors;
}

这样只是申明了类的变量,不是类的属性。此时不能通过点表示法来访问,即car.make是错误的。
将上面的类变量设置为属性:

#import <Foundation/Foundation.h>

@interface Car : NSObject
{
int year;
NSString *make;
NSString *model;
NSArray *colors;
}
@property int year; //将类变量申明为属性
@property (retain) NSString *make;
@property (retain) NSString *model;
@property (retain) NSArray *colors;
@property (readonly) NSString *carInfo;
@end

并且,在类实现文件中合成属性:

@synthesize make;
@synthesize model;
@synthesize year;
@synthesize colors;

此时,点表示法和内存管理的优势就体现出来了。

点表示法:

[NSString stringWithFormat:@"Car Info\nMake: %@\nModel: %@\nYear: %d", self.make, self.model, self.year];

内存管理:

属性简化了内存管理,你可以创建在对象整个生命周期内自动保留实例变量的属性,然后当你把这些变量设为空值时就释放这些对象。

对于属性,不要直接发送release给已保留的属性,应该如下这样的方式:

self.make = nil;
self.model = nil;

属性的特性:

readwrite 读写

readonly  只读

assgin     原子的

retain      已保留的

@property NSString *name;

上面这种方式默认使用了assgin属性特性

@property (retain) NSString *name;

属性特性设为retain实现了两个功能。首先,它保留了赋值时传递的对象。其次,它在进行新的赋值之前释放以前的值。
copy    使用它将发送一条复制的消息给被传递的对象,保留它,并释放任何以前的值。

nonatomic  非原子性

非原子性可以加快访问速度,但当两个竞争线程同时尝试修改同一个属性时就会出现问题。

原文地址:https://www.cnblogs.com/foxmin/p/2413142.html