@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
呢?