假设我有一个只有名称和照片的联系人对象
@interface Contact: NSObject
{
NSString *name;
UIImage *photo;
}
@property (copy) NSString name;
@property (copy) UIImage photo;
进一步假设我住在一个我有1000个人叫Sam的地方,他们都是克隆人,所以他们的照片看起来完全一样,我决定作弊并为所有人使用相同的照片。
目标C是否足够智能,当获取名称和照片的副本时,它会识别它具有相同的值并且可以由一个对象处理并为所有Sams分配一个NSString和一个UIImage?
处理此问题的正确方法是什么?显然,我确实需要让它们复制属性来处理非Sam案例,以防我传递可变字符串和图像。
答案 0 :(得分:1)
UIImage
不符合NSCopying
协议,所以这个问题没有实际意义。您需要将copy
属性上的photo
更改为retain
。这对你来说非常好,因为UIImage
无论如何都不可变(并且没有可变的子类),所以不需要复制它。
至于名称,在不可变对象(支持复制)上调用-copy
往往只保留对象而不是复制它。在这些对象的可变变体上调用它(例如NSMutableString
)将产生一个不可变的副本(它本身将通过保留来响应后续的-copy
个请求)。但请注意,多次调用可变对象上的-copy
将产生不同的不可变副本。
答案 1 :(得分:0)
如果您使用[UIImage imageNamed:],那么sdk将为您缓存照片并重复使用它。此外,由于UIImage是不可变的,因此在将其加载到内存后无法真正改变它。
图像对象是不可变的,因此您无法更改其属性 创作之后。这意味着您通常指定图像 初始化时的属性或依赖于图像的元数据 提供物业价值。
如果您想使联系人符合NSCopying,请确保在复制对象时在NSString上使用复制。