17
@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 写“分配”是否正确?

任何帮助表示赞赏。在此先感谢!

4

4 回答 4

15

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

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

'assign' 是整数的默认(实际上是唯一的)可能设置。整数不能像对象一样被保留或复制。

于 2013-08-30T07:12:11.743 回答
7

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

这就是您要这样做的原因:

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

Person.name 属性的当前值将根据属性被声明为保留还是复制而有所不同——如果属性被标记为保留,它将是 @"Debajit",但如果属性被标记为复制,它将是 @"Chris"。

因为在几乎所有情况下,您都希望防止在其背后改变对象的属性,因此您应该将表示它们的属性标记为副本。(如果您自己编写 setter 而不是使用 @synthesize 您应该记住实际使用 copy 而不是在其中保留。)

于 2013-08-30T07:09:27.067 回答
3

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

对于NSString, 或一般来说任何具有已知可变子类 ( NSArray, NSDictionaty, NSSet) 的不可变类,首选复制以避免客户端设置可变实例并从对象中修改它。

对于原始类型(例如 int),copy/strong 没有意义,默认情况下使用 assign。是否要明确说明取决于您。

于 2013-08-30T07:16:46.083 回答
1

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

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

于 2013-08-30T07:15:34.877 回答