2012-03-14 65 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