作者:白日做梦家_ | 来源:互联网 | 2023-09-09 09:09
@interfaceSomeClass:NSObject@property(copy,nonatomic)NSString*usefulString;@property(st
@interface SomeClass : NSObject
@property (copy, nonatomic) NSString *usefulString;
@property (strong, nonatomic) NSString *dangerousString;
@property (copy, nonatomic) NSURL *curiousURLOne;
@property (strong, nonatomic) NSURL *curiousURLTwo;
@end
In the above class, dangerousString
is considered a bad idea because NSMutableString
inherits from NSString
. Meaning it is possible a user of your class could set a mutable string to dangerousString
, and then later change the value of the mutable string out from underneath the instance of SomeClass
. The property usefulString
doesn't have this danger as it copies the value into a new (immutable) string object.
在上面的类中,dangerousString被认为是个坏主意,因为NSMutableString继承自NSString。这意味着您的类的用户可以将可变字符串设置为dangerousString,然后在SomeClass实例下面更改可变字符串的值。属性usefulString没有这种危险,因为它将值复制到一个新的(不可变的)字符串对象中。
However, it seems like for NSURL
(and any other foundation classes that don't have mutable counterparts - e.g. NSNumber
) the copy semantic of the property declaration is unnecessary. NSURL
does conform to NSCopying's copyWithZone:
(...but I have to wonder if it doesn't just return the same object with an increased retain count - why would it do anything else?)
但是,似乎对于NSURL(以及任何其他不具有可变对应物的基础类 - 例如NSNumber),属性声明的复制语义是不必要的。 NSURL确实符合NSCopying的copyWithZone :( ...但是我不得不怀疑它是否只是返回相同的对象并增加了保留计数 - 为什么还要做其他事情?)
Why would you declare properties as copy
that don't have a danger of being mutated?
为什么要将属性声明为没有变异危险的副本?
2 个解决方案