什么时候不分配和初始化NSString

时间:2010-09-27 04:40:37

标签: objective-c cocoa memory-management nsstring string

每当我需要创建一个新的NSString变量时,我总是分配并初始化它。似乎有时候你不想这样做。你怎么知道何时分配和初始化NSString以及何时不知道?

4 个答案:

答案 0 :(得分:18)

  

每当我需要创建一个新的NSString变量时,我总是分配并初始化它。

不,这没有意义。

变量从程序遇到您声明它的那一刻起就存在:

NSString *myString;

此变量不是NSString。它是指向NSString的指针的存储。这就是*指示的内容:该变量包含指针。

NSString 对象仅在您创建一个时存在:

[[NSString alloc] init];

并且指向该对象的指针仅在您从那里指定它的那一刻起变量:

myString = [[NSString alloc] init];
//Or, initializing the variable in its declaration:
NSString *myString = [[NSString alloc] init];

因此,如果你要从其他地方获取一个字符串对象(例如substringWithRange:),你可以跳过创建一个新的空对象,因为你只是要将指针替换为带有指向另一个的指针的空字符串。

有时你确实想要创建一个空字符串;例如,如果您要一次一个地获取一串字符串(例如,来自NSScanner)并且想要将它们中的一些或全部连接成一个大字符串,则可以创建一个空的可变字符串(使用{{ 1}}和alloc)并发送init个消息来进行连接。

您还需要appendString: releasealloc创建的任何对象。这是Memory Management Programming Guide中的规则之一。

答案 1 :(得分:12)

如果要将其初始化为已知值,使用alloc几乎没有意义,您只需使用字符串文字:

NSString* myStr = @"Some value";

如果你想用格式或其他什么来初始化它,但不需要它超出当前自动释放池的生命周期,那么使用类方便方法有点简洁:

NSString* myTempStr = [NSString stringWithFormat:@"%d", myIntVar];

如果您需要使用其生命周期,请alloc / init或者在前一次调用中添加retain。我倾向于略微偏爱后者,但两者几乎相当。无论哪种方式,您都需要稍后进行平衡release

请注意,由于NSString不可变,因此这种事情不仅是不必要的,而是积极地错误

// don't do this!
NSString* myStr = [[NSString alloc] initWithString:@""];
myStr = someOtherStr;

因为它泄漏了初始占位符值。

答案 2 :(得分:4)

  

似乎有些时候你不想这样做。

我想不出任何时候 想要分配/初始化NSString。由于NSStringgs是不可变的,因此您几乎总是通过以下方法之一创建新字符串:

  • 便利类方法,例如

    NSString* foo = [NSString stringWithFormat:...];
    
  • 字面

    NSString* foo = @"literal";
    
  • NSString实例方法

    NSString* foo = [bar uppercaseString];
    
  • 从可变字符串中复制

    NSString* foo = [mutableBar copy];  // foo needs to be released or autoreleased in this case
    

答案 3 :(得分:1)

我猜你指的是使用StringWithString或类似的而不是initWithString? StringWithString在引擎盖下为你分配并返回一个自动释放的字符串。

如果除了拥有字符串之外不需要进行任何字符串操作,可以使用NSString *str = @"string";

一般情况下,对iOS来说,管理内存越严格越好。这意味着如果您不需要从方法返回字符串,则应该分配init然后释放它。

如果你需要返回一个字符串,当然你需要返回一个自动释放的字符串。我不认为它比这更复杂。