2009-07-16 46 views
1

我有以下簡單的類:可以從getter返回財產的副本嗎?

@interface Article: NSObject { 
    NSString *title; 
} 
@property (copy, nonatomic) NSString *title; 
@end 

@implementation 

- (void)setTitle:(NSString *)aString { 
    if ((!title && !aString) || (title && aString && [title isEqualToString:aString])) return; 
    dirty = YES; 
    [title release]; 
    title = [aString copy]; 
} 

- (NSString *)title { 
    return title; 
} 

@end 

在我的應用程序必須做很多事情就像

Article *article= [objectsArray getObjectAtIndex:x]; 
NSString *title=article.title; 
UILabel.text=title; 
[title release]; 

我知道我應該打電話時,我得到保留物業:

NSString *title=[article.title retain]; 

也許我懶得做一個保留,其中我g等等。或者如果我需要在整個應用程序中做幾十次。

我可以讓吸氣劑返回副本嗎?

- (NSString *)title { 
    return [title copy]; 
} 

回答

7

在某些情況下,出於安全原因,我更願意歸還財產的副本。例如,如果我正在編寫一個具有唯一標識符屬性的類,那麼我將「返回[[_uniqueID copy] autorelease]」,以便其他類別無法對唯一標識符執行任何操作。其他時候,我只會返回對象本身,因爲如果它是外部操縱的,這並不重要。

另外,就這些getter方法而言,它們不應該返回具有+1保留計數的對象(這就是你所要做的)。如果有的話,他們應該直接返回對象或返回一個+0保留計數(保留/複製+自動釋放)。它大大地簡化你的內存管理,做到這一點。如果外部對象需要保留返回的對象,那麼外部對象應該負責保留它所需的任何內容。

1

這是一個好主意,可以返回一個可變屬性的副本,以便其他對象無法將您的對象從您的下方移出。

在普通NSString的情況下,由於它是不可變的,所以copyretain都做同樣的事情 - 它們保留字符串並返回它。

+0

我不同意,最好是返回一個不可變的引用(特別是在庫中),所以只有需要mutate的客戶才需要支付複製的費用。在某些情況下,始終複製的開銷可能會過高。 – notnoop 2009-07-16 15:50:20

1

在Chuck的筆記中,您經常會看到(NSMutableString *)屬性返回對象的副本,而不是對原始字符串的引用。就像他指出的那樣,這是一種安全機制,允許您在訪問字符串時處理字符串的「快照」。

但是,在您的特定示例中,它看起來像title屬性被設置一次,然後被訪問以用作UILabel中的文本。

如果這是您唯一的應用程序,那麼您在技術上不必在從存取器獲取NSString時保留NSString。

NSString * articleTitle = article.title; 
label.text = articleTitle; 
articleTitle = nil; 

UILabel將在設置'text'屬性時存儲字符串的保留副本。設置文本後,您可以「刪除」參考,您將得到相同的結果。不涉及額外的保留/釋放。 (雖然這可能是一個好的做法)