我是否应该在一个对象中为我的(NSString *)attr使用@property(非原子,复制)或@property(非原子,强)?

时间:2013-08-30 07:05:16

标签: ios objective-c

@interface PaneBean : NSObject

@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *type;
@property(nonatomic,assign) NSInteger width;
@end

我有一个如上所示的PaneBean。

我是否应该@property(nonatomic,copy)@property(nonatomic,strong)使用(NSString *) name?他们之间有什么区别?

为NSInteger编写'assign'是对的吗?

任何帮助表示赞赏。谢谢!

4 个答案:

答案 0 :(得分:15)

'copy'将导致该属性的setter创建对象的副本,否则与strong相同。您可以使用它来确保如果有人将您的属性设置为可变字符串,然后改变字符串,您仍然具有原始值。如果字符串不可变,Cocoa将默默地优化复制操作,这很好:)

'strong'将保持该属性的值,直到它被设置为其他东西。如果你希望传入的可变字符串从你下面改变(不是不可能的,但不是所有常见的,想要的东西),那么强大就是正确的做法。通常,强对于表示比简单“值”更复杂的对象(即不是NSString,NSNumber,NSValue等等)更有用。

'assign'是整数的默认设置(实际上只是)。无法像对象一样保留或复制整数。

答案 1 :(得分:7)

对于类型为符合NSCopying协议的不可变值类的属性,您几乎总是应在@property声明中指定copy。在这种情况下,指定retain是你几乎从不想要的东西。在非ARC中,strong会像retain

一样工作

这就是你想要这样做的原因:

NSMutableString *someName = [NSMutableString stringWithString:@"Chris"];
Person *p = [[[Person alloc] init] autorelease];
p.name = someName;
[someName setString:@"Debajit"];

Person.name属性的当前值将根据属性是声明为retain还是copy而不同 - 如果属性标记为retain,则为@“Debajit”,如果属性已标记,则为@“Chris”副本。

因为在几乎所有情况下你都希望防止在其背后改变对象的属性,所以你应该标记代表它们的属性。 (如果你自己编写setter而不是使用@synthesize,你应该记得实际使用copy而不是retain。)

答案 2 :(得分:3)

copy向您设置的对象发送copy消息,而strong仅保留该消息(增加引用计数)。

对于NSString,或者通常任何具有已知可变子类(NSArrayNSDictionatyNSSet)的不可变类,都会优先复制以避免客户端设置可变实例并将其修改为对象。

对于基本类型(例如int),copy / strong没有意义,默认情况下使用assign。如果您想明确表达或不明确,请由您决定。

答案 3 :(得分:1)

强表示组成,而弱表示聚合。

复制意味着在将旧对象的内容复制到新对象之前创建新对象。在这种情况下,拥有对象PaneBean将由新创建的对象组成。