您的位置:首页 > 运维架构

@property 的使用

2014-03-20 17:25 288 查看
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.直接上代码:

@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, 这不是我们想要的。

如果

@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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: