Objective-C语言关键词,与@synthesize配对使用。
功能:让编译器自动编写一个与数据成员同名的方法声明来省去读写方法的声明。
说白了,就是java中的getter setter方法。
声明property的语法为:
@property (参数1,参数2) 类型 名字; 如: @property(nonatomic,retain) UIWindow *window; 其中参数主要分为三类: 读写属性: (readwrite/readonly) setter语意:(assign/retain/copy) 原子性: (atomicity/nonatomic) 各参数意义如下: readwrite 产生setter\getter方法 readonly 只产生简单的getter,没有setter。 assign 默认类型,setter方法直接赋值,而不进行retain操作 retain setter方法对参数进行release旧值,再retain新值。 copy setter方法进行Copy操作,与retain一样 nonatomic 禁止多线程,变量保护,提高性能。assign 通常用于基本类型,如int,bool,char等。
copy 通常用于NSString,NSNumber,NSArray等不变的类型。
retain 一般的NSObject 都用这个。
下面解释一下NSString类型的变量的setter方法为什么要用copy.直接上代码:
1
2
3
4
5
6
7
8
9
10
|
@interface
Person
@property
(
nonatomic
, retain)
NSString
*name;
@end
Person *p = [[Person alloc] init];
NSMutableString
*name = [[
NSMutableString
alloc] initWithString:@
"hello"
];
p.name = name;
[name appendString:@
" world"
];
NSLog
(@
"%@"
, p.name);
// 此时p.name已变成hello world, 这不是我们想要的。
|
1
2
3
4
5
6
7
8
9
10
|
@interface
Person
@property
(
nonatomic
,
copy
)
NSString
*name;
@end
Person *p = [[Person alloc] init];
NSMutableString
*name = [[
NSMutableString
alloc] initWithString:@
"hello"
];
p.name = name;
[name appendString:@
" world"
];
NSLog
(@
"%@"
, p.name);
// 此时p.name仍为hello, 这是正确的。
|
NSString类型变量的值是不会发生变化的,但变量的内存地址是会发生变化的。copy的用法是复制内容,并且新分配一块内存地址。而retain则是将输入参数的内存地址复制一份,赋给成员变量。所以copy和retain的区别在于,如果传入的参数是NSMutableString类型的话,这个参数一旦发生变化,成员变量的内容也会发生变化;而用copy,则不会发生这种情况(因为两者的内存地址完全不同)。如果传入的参数是NSString,则用copy和retain的效果完全一样,没什么分别。所以NSString、NSArray等不可变的类型建议用copy。
以上代码来自cocoachina
http://www.cocoachina.com/bbs/read.php?tid=107184&toread=1