@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'是对的吗?
任何帮助表示赞赏。谢谢!
答案 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
,或者通常任何具有已知可变子类(NSArray
,NSDictionaty
,NSSet
)的不可变类,都会优先复制以避免客户端设置可变实例并将其修改为对象。
对于基本类型(例如int),copy / strong没有意义,默认情况下使用assign。如果您想明确表达或不明确,请由您决定。
答案 3 :(得分:1)
强表示组成,而弱表示聚合。
复制意味着在将旧对象的内容复制到新对象之前创建新对象。在这种情况下,拥有对象PaneBean将由新创建的对象组成。