@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没有变异危险的属性?