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

kon*_*ong 17 objective-c ios

@interface PaneBean : NSObject

@property(nonatomic,copy) NSString *name;
@property(nonatomic,copy) NSString *type;
@property(nonatomic,assign) NSInteger width;
@end
Run Code Online (Sandbox Code Playgroud)

我有一个如上所示的PaneBean.

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

为NSInteger编写'assign'是正确的吗?

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

Cat*_*Man 15

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

'strong'将保持房产的价值,直到它被设置为别的东西.如果你想让传入的可变字符串从你下面改变(不是不可能的,但不是所有那些常见的,想要的东西),那么强者就是正确的做法.通常,强对于表示比简单"值"更复杂的对象(即不是NSString,NSNumber,NSValue等等)更有用.

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


小智 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"];
Run Code Online (Sandbox Code Playgroud)

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

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