0

假设我有一个只有姓名和照片的联系人对象

@interface Contact: NSObject
{
    NSString *name;
    UIImage *photo;
}
@property (copy) NSString name;
@property (copy) UIImage photo;

进一步假设我住在一个有 1000 个人叫 Sam 的地方,他们都是克隆人,所以他们的照片看起来完全一样,我决定作弊并为所有人使用同一张照片。

Objective C 是否足够聪明,以至于当获取姓名和照片的副本时,它会识别出它具有相同的值,并且可以由一个对象处理并为所有 Sam 分配一个 NSString 和一个 UIImage 吗?

处理这个问题的正确方法是什么?显然,我确实需要让它们复制属性以处理非 Sam 案例,以防我收到传递的可变字符串和图像。

4

2 回答 2

1

UIImage不符合NSCopying协议,所以这个问题没有实际意义。您需要将属性copy上的更改为. 这对您来说非常好,因为它无论如何都不是可变的(并且没有可变的子类),因此无需复制它。photoretainUIImage

至于名称,调用-copy不可变对象(支持复制)往往只是保留对象而不是复制它。在这些对象的可变变体上调用它(例如)将产生一个不可变的副本(它本身将通过保留NSMutableString来响应后续请求)。-copy但是请注意,-copy多次调用可变对象将产生不同的不可变副本。

于 2012-03-08T01:13:07.960 回答
0

如果您使用 [UIImage imageNamed:] 则 sdk 将为您缓存照片并重复使用它。此外,由于 UIImage 是不可变的,因此在将其加载到内存后您无法真正更改它。

图像对象是不可变的,因此您无法在创建后更改它们的属性。这意味着您通常在初始化时指定图像的属性或依赖图像的元数据来提供属性值。

如果您想让您的联系人符合 NSCopying,只需确保在复制对象时在 NSString 上使用 copy。

于 2012-03-08T01:16:35.633 回答