我正在为自定义A类实现copyWithZone方法,其中NSNumber指针被声明为(retain)属性
@class A <NSCopying>
{
NSNumber *num;
}
@property (nonatomic, retain) NSNumber *num; // synthesized in .m file
-(id) copyWithZone:(NSZone*) zone {
A *new = [[A alloc] init];
new.num = [num copy];
return new;
}
当我调试时,我总是发现new.num与self.num的地址相同。
即使我使用
new.num = [NSNumber numberWithFloat: [num floatValue]];
我仍然得到相同的地址。最后,我必须使用
new.num = [[[NSNumber alloc] initWithFloat:[num floatValue]] autorelease]
实现我想要的结果。我只是想知道为什么NSNumber符合但复制后不返回新的内存地址?
由于
利奥
答案 0 :(得分:10)
NSNumber是不可变的。制作副本毫无意义,因此,当调用副本时,框架只会返回自我。
如果某个类实现NSCopying,则应将该属性标记为copy
(而不是retain
)。关于不可变类(-copy
)的NSString
将只返回对象的引用(带有凸起的保留计数)。如果传递了一个可变实例,它将被复制到一个不可变实例。这可以防止外部方改变对象背后的状态。
答案 1 :(得分:10)
NSNumber不仅是不可变的 - 对于低值,它也是Flyweight。
答案 2 :(得分:3)
NSNumber
不可变,因此无需强制进行物理复制。
答案 3 :(得分:-2)
在实施NSCopying协议时,您应该使用[[A alloc] initWithZone:zone]。
正如其他人所说,NSNumber是不可变的,所以返回相同的对象。