初始化一个新字符串

时间:2011-12-22 10:47:14

标签: objective-c memory-management

这是一个初学者的问题。 我今天需要一个新的字符串变量,所以我做了类似的事情:

NSString* newString = nil;
if(something)
newString = @"a value";
else
newString = @"different value";

它运作得很好。不过,我对内存分配知之甚少,我担心这可能会以某种方式引起问题,所以我最终将代码更改为:

NSString* newString = [NSString stringWithFormat:@""];
if(something) ...

我以前做过的做法是不是很糟糕? 我知道有些变量会自动分配,所以你不需要为它们调用alloc,但是不能将它们初始化为nil也一样吗? 我很抱歉,如果这个问题听起来很愚蠢,我来自php的Objective-c,我对内存管理的了解很接近.. nil

[修改] 这不是关于nil vs @“”的问题; 我的问题是,如果可以简单地使用NSString = something(nil,@“”,@“一个值”),并且通常情况下可以为对象执行此操作。 例如,我可以简单地执行NSRandomObject = [[NSRandomObject* alloc] init];

,而不是NSRandomObject = aValue;

2 个答案:

答案 0 :(得分:2)

由于if的两个分支都将值分配给newString,因此if之前的分配无效。

决定是否将字符串初始化为nil而不是空字符串是应用程序级决策,通常以“字符串不在那里”和“字符串在那里”之间的区别为中心,但它是空的。“

答案 1 :(得分:2)

@为前缀的字符串仅存储在程序代码中一次,然后用作静态地址。没有必要担心他们的记忆。

事实上,使用stringWithFormat占用的内存远远超过简单@"string"

有趣的事实:@"this is a very long string"在分配给变量时占用与nil一样多的内存。它们都只是一个内存地址。当然,字符串将存储在内存中的某个位置,但几乎所有代码都可以重复使用它。