我是否应该在一个对象中使用@property(nonatomic,copy)或@property(nonatomic,strong)作为我的(NSString *)attr?

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

如上所示,我有一个PaneBean。

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

为NSInteger写“赋值”是否正确?

任何帮助表示感谢。提前感谢!

“复制”将导致该属性的设置者创build该对象的副本,否则与强相同。 你可以用这个来确保如果有人把你的属性设置为一个可变string,然后改变string,你仍然有原始值。 如果string不可变,Cocoa会默默地优化复制操作,这很好:)

“坚强”将保持物业的价值,直到它成为别的东西。 如果你想让传入的可变string从你的下面(不是不可能的,但不是所有常见的,想要的东西)都变出来,那么强壮就是正确的做法。 一般来说,强对于表示比简单的“值”(比如NSString,NSNumber,NSValue等等)更复杂的对象更有用。

“分配”是整数的默认(实际上只有)可能的设置。 整数不能像对象一样被保留或复制。

对于types为符合NSCopying协议的不可变值类的属性,几乎总是应该在@property声明中指定copy。 指定保留是你在这种情况下几乎从不想要的东西。在非ARC中,强大的工作将像保留一样工作

这就是为什么你想这样做:

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

Person.name属性的当前值将根据属性是否声明保留或复制而有所不同 – 如果属性标记为retain,则为“Debajit”,如果属性为复制,则为“Chris”。

由于在几乎所有情况下,您都希望防止对象背后的对象属性发生变化,因此应该将代表它们的属性标记为复制。 (如果你自己编写setter而不是使用@synthesize,你应该记得实际使用copy而不是retain。

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

对于NSString ,或者一般来说,任何带有已知可变子类( NSArrayNSDictionatyNSSet )的无形类,都会优先考虑copy,以避免客户端设置可变实例并将其修改出对象。

对于原始types(例如int),copy / strong没有意义,默认情况下使用assign。 如果你想明确或不明确地由你决定。

强指示组合,而弱指示聚合。

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