@interface SomeClass : NSObject
@property (copy, nonatomic) NSString *usefulString;
@property (strong, nonatomic) NSString *dangerousString;
@property (copy, nonatomic) NSURL *curiousURLOne;
@property (strong, nonatomic) NSURL *curiousURLTwo;
@end
在上面的类中,dangerousString
被认为是一个坏主意,因为NSMutableString
继承自NSString
. 这意味着您的类的用户可能会将可变字符串设置为dangerousString
,然后稍后将可变字符串的值从SomeClass
. 该属性usefulString
没有这种危险,因为它将值复制到一个新的(不可变的)字符串对象中。
NSURL
但是,对于(以及任何其他没有可变对应物的基础类 - 例如NSNumber
),属性声明的复制语义似乎是不必要的。NSURL
确实符合 NSCopying 的copyWithZone:
(......但我不得不怀疑它是否不只是返回相同的对象并增加了保留计数 - 为什么它会做其他任何事情?)
你为什么要声明copy
没有变异危险的属性?