之前的KVC和KVO中都使用了accessor方法,如果成员变量很多的情况下,不然就得写下很多的类似的方法? Objective -C在此处就是用了@property来代替:
之前的
@interface AppDelegate : NSObject <NSApplicationDelegate>
{
int sliderNumber;
}
- (int)sliderNumber;
- (void)setSliderNumber:(int)x;
@property (assign) IBOutlet NSWindow *window;
- (IBAction)incrementSliderNumber:(id)sender;
@end
则就可以改成
@interface AppDelegate : NSObject <NSApplicationDelegate>
{
int sliderNumber;
}
@property (assign) int sliderNumber;
@property (assign) IBOutlet NSWindow *window;
- (IBAction)incrementSliderNumber:(id)sender;
@end
并且在KVCAppDelegate.m中 也就不用去实现
- (int)sliderNumber;
(void)setSliderNumber:(int)x;这2个方法了,而是替代的写成@synthesize sliderNumber;
Property的属性:
一般,property的声明如下:
@property(attributes)type name;
attributes 可包括readwrite和readonly 两种,默认的是readwrite,设置为readonly的就没有set方法。
描述set方法如何工作,属性包括下面的一种:
assign (默认) 创建一个赋值语句,这个属性通常用于标量变量,而非指针类型变量(如整型和浮点型)
strong 强引用类型,让对象在指针设置时就一直被指向,避免重新分配,特别是ARC,如果没有使用ARC则与retain属性相同
weak 若引用,出了在指向的对象被释放的情况下,property将被设置为nil(ARC才有)
copy 创建新值的复制,通常用于字符创或者可变子类情况
retain 参照strong
nonatomic (非原子操作)
atomic (原子操作)
原子操作: 在多线程的应用程序中,setter方法在一个线程的执行与同一setter方法在另一个线程的执行不会冲突,包括使用了锁来保证同一时刻只有一个setter方法在执行,创建 和使用锁会带来额外的开销,假如开发者能够确认accessor方法不需要原子操作,那么最好使用非原子操作,来减小开销.