这是一个初学者的问题。 我今天需要一个新的字符串变量,所以我做了类似的事情:
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;
答案 0 :(得分:2)
由于if
的两个分支都将值分配给newString
,因此if
之前的分配无效。
决定是否将字符串初始化为nil
而不是空字符串是应用程序级决策,通常以“字符串不在那里”和“字符串在那里”之间的区别为中心,但它是空的。“
答案 1 :(得分:2)
以@
为前缀的字符串仅存储在程序代码中一次,然后用作静态地址。没有必要担心他们的记忆。
事实上,使用stringWithFormat
占用的内存远远超过简单@"string"
有趣的事实:@"this is a very long string"
在分配给变量时占用与nil
一样多的内存。它们都只是一个内存地址。当然,字符串将存储在内存中的某个位置,但几乎所有代码都可以重复使用它。