2012-03-14 87 views
3

我正在開發一個帶有最新SDK和XCode 4.2的iOs 4應用程序。我有一個關於NSString參數的問題。這是我的類定義:複製或保留NSString參數?

#import <Foundation/Foundation.h> 

@interface BlogEntry : NSObject 
{ 
    NSString* title; 
    NSString* text; 
    NSDate* date; 
    NSString* photo; 
} 

- (id)initWithTitle:(NSString*)titulo text:(NSString*)texto date:(NSDate*)fecha photo:(NSString*)foto; 

@end 

與實現

#import "BlogEntry.h" 

@implementation BlogEntry 

- (id)initWithTitle:(NSString*)titulo text:(NSString*)texto date:(NSDate*)fecha photo:(NSString*)foto 
{ 
    if (self = [super init]) 
    { 
     title = titulo; 
     text = texto; 
     date = fecha; 
     photo = foto; 
    } 
    return self; 
} 

@end 

我可能需要保留initWithTitle參數?或者,我可能需要複製它們嗎?

回答

4

如果ARC,沒有。如果非ARC,是的。

對於NSString ivars,通常是copy。對於NSDate伊娃,retaincopyNSString的原因是NSMutableString在您的init方法中通過。複製參數可以防止它被你的類所變異。因此,它確保封裝。

+5

兩個問題。即使使用ARC,也需要使用複製語義發送這些屬性的副本(ARC僅自動添加保留和發佈)。另外,'NSDate'實現'NSCopying',所以它也應該發送'-copy'。 – JeremyP 2012-03-14 11:41:19

+2

概括 - 任何實現'NSCopying'的應該是'copy'語義。然而,我使用經驗法則'如果它有一個可變的子類,複製它'。 – deanWombourne 2012-03-14 12:24:26