@property 的使用

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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值