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

在Objective-C中创建内存效率高的对象,objective-c,memory-management,memory-efficient,Objective C,Memory Management,Memory Efficient,假设我有一个联系人对象,只有一个名字和一张照片 @interface Contact: NSObject { NSString *name; UIImage *photo; } @property (copy) NSString name; @property (copy) UIImage photo; 进一步假设我住在一个地方,我有1000个叫山姆的人,他们都是克隆人,所以他们的照片看起来一模一样,我决定欺骗他们,对他们都使用相同的照片 Objective C是否足够智能,当

假设我有一个联系人对象,只有一个名字和一张照片

@interface Contact: NSObject
{
    NSString *name;
    UIImage *photo;
}
@property (copy) NSString name;
@property (copy) UIImage photo;
进一步假设我住在一个地方,我有1000个叫山姆的人,他们都是克隆人,所以他们的照片看起来一模一样,我决定欺骗他们,对他们都使用相同的照片

Objective C是否足够智能,当拍摄名称和照片的副本时,它会识别出它具有相同的值,并且可以由一个对象处理,并且只为所有SAM分配一个NSString和一个UIImage


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

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


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

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

图像对象是不可变的,因此不能更改其属性 创造之后。这意味着您通常指定图像的 属性,或者依赖于映像的元数据 提供属性值


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

语言只与程序员一样聪明。如果你告诉它使用同一个对象,它会这样做,否则它不会。