2012-03-08 44 views
0

我想有一個名字和照片聯繫人對象只創建存儲在Objective-C高效的目標

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

進一步假設,我住在一個地方,我有1000人叫山姆和他們都克隆,所以他們的照片看起來完全一樣,我決定欺騙和使用相同的照片爲他們所有。

Objective C是否足夠智能,以便在獲取名稱和照片的副本時,它會識別出它具有相同的值,並且可以由一個對象處理併爲所有Sams分配一個NSString和一個UIImage?

處理這個問題的正確方法是什麼?很明顯,我確實需要讓他們複製屬性來處理非Sam案例,並且在我傳遞可變字符串和圖像的情況下。

+0

語言只和程序員一樣聰明。如果你告訴它使用相同的對象,它會這樣做,否則它不會。 – sosborn 2012-03-08 01:24:34

回答

1

UIImage不符合NSCopying協議,所以問題是相當有限的。您需要將photo屬性上的copy更改爲retain。這對你來說很好,因爲UIImage無論如何都是不可變的(並且沒有可變的子類),所以沒有必要複製它。

至於名稱,在不可變對象(支持複製)上調用-copy往往只保留對象而不是複製它。在這些對象的可變變體(例如NSMutableString)上調用它將產生一個不可變的副本(它本身會通過保留來響應後續的-copy請求)。但請注意,多次調用可變對象上的-copy將生成不同的不可變副本。

0

如果您使用[UIImage imageNamed:],則sdk會爲您緩存照片並重新使用它。另外,由於UIImage是不可變的,所以在載入內存之後不能真正改變它。

圖像對象是不可變的,因此創建後您不能更改其屬性 。這意味着您通常會在初始化時指定圖像的 屬性,或者依賴圖像的元數據來提供屬性值 。

如果你想使你的聯繫符合NSCopying,只要確保在複製對象時使用NSString上的副本。