在Objective-C中创建内存有效的对象

时间:2012-03-08 01:11:33

标签: objective-c memory-management memory-efficient

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

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

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

目标C是否足够智能,当获取名称和照片的副本时,它会识别它具有相同的值并且可以由一个对象处理并为所有Sams分配一个NSString和一个UIImage?

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

  

图像对象是不可变的,因此您无法更改其属性   创作之后。这意味着您通常指定图像   初始化时的属性或依赖于图像的元数据   提供物业价值。

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