Objective c 初始化新字符串

Objective c 初始化新字符串,objective-c,memory-management,Objective C,Memory Management,这是一个初学者的问题。 今天我需要一个新的字符串变量,所以我做了如下操作: NSString* newString = nil; if(something) newString = @"a value"; else newString = @"different value"; 而且效果很好。尽管如此,我还是对内存分配有一点了解,我担心这可能会导致一些问题,所以最后我将代码改为: NSString* newString = [NSString stringWithFormat:@""]; if

这是一个初学者的问题。 今天我需要一个新的字符串变量,所以我做了如下操作:

NSString* newString = nil;
if(something)
newString = @"a value";
else
newString = @"different value";
而且效果很好。尽管如此,我还是对内存分配有一点了解,我担心这可能会导致一些问题,所以最后我将代码改为:

NSString* newString = [NSString stringWithFormat:@""];
if(something) ...
这是我以前做的不好的练习吗? 我知道有些变量是自动分配的,所以您不需要为它们调用alloc,但是将它们初始化为nil不也同样有效吗? 如果这个问题听起来很傻,我很抱歉,我是从php来学习objective-c的,我对内存管理的了解接近。。零

[编辑] 这不是一个零对零的问题; 我的问题是,如果简单地使用
NSString=something
(nil、@、“@”a值)是可以的,并且通常对对象这样做是可以的。
例如,不执行
NSRandomObject=[[NSRandomObject*alloc]init]我只需执行
NSRandomObject=aValue

由于
if
的两个分支都为
newString
赋值,因此
if
之前的赋值无效


决定是否将字符串初始化为
nil
还是空字符串是应用程序级别的决定,通常围绕“字符串不在那里”和“字符串在那里,但它是空的”之间的区别来进行。因为
if
的两个分支都为
新闻字符串指定了一个值,如果
无效,则在
之前分配


决定是否将字符串初始化为
nil
vs.空字符串是应用程序级的决定,通常围绕“字符串不在那里”和“字符串在那里,但它是空的”之间的区别来决定。

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

事实上,使用
stringWithFormat
比简单地使用
@“string”


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

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

事实上,使用
stringWithFormat
比简单地使用
@“string”


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

当然它没有效果,这是一个想法:D我不能使用NSString*字符串=@“某物”;在if中,然后是else中的字符串,因为它会告诉我它没有正确声明。这就是为什么我在if/else结构之前使用了一个空init。@BogdanBucur在重写
if
(即无条件)两侧的值时,最好初始化为
nil
。谢谢,这就是我需要知道的!我感谢你的帮助当然没有效果,这是我的想法:D我不能使用NSString*theString=@“something”;在if中,然后是else中的字符串,因为它会告诉我它没有正确声明。这就是为什么我在if/else结构之前使用了一个空init。@BogdanBucur在重写
if
(即无条件)两侧的值时,最好初始化为
nil
。谢谢,这就是我需要知道的!我感谢你的帮助这真是一个有趣的事实。不过,我关心的是,在能够在if/else结构中使用变量之前,我需要声明变量。因此,我认为可以将其声明为nil或其他任何值,然后稍后给它一个正确的值?指针的内容将始终是4字节(或64位体系结构中的8字节)。分配初始值将写入这4个字节,立即覆盖它将意味着您已写入8个字节。如果这对您非常重要,请不要指定初始值。不过,在使用它之前,一定要在之后分配它。不,这不是那种只有几个字节才真正重要的应用程序。从我之前看到的情况来看,在obj-c中正确分配和释放对象是很重要的。在我的示例中,我没有分配任何内容,而是将其设置为nil,这是我在取消分配变量时通常执行的操作。所以我的担心是假的。。。我认为字符串可能只是接收一个随机指针,覆盖另一个对象的指针并导致崩溃,这是一个有趣的事实。不过,我关心的是,在能够在if/else结构中使用变量之前,我需要声明变量。因此,我认为可以将其声明为nil或其他任何值,然后稍后给它一个正确的值?指针的内容将始终是4字节(或64位体系结构中的8字节)。分配初始值将写入这4个字节,立即覆盖它将意味着您已写入8个字节。如果这对您非常重要,请不要指定初始值。不过,在使用它之前,一定要在之后分配它。不,这不是那种只有几个字节才真正重要的应用程序。从我之前看到的情况来看,在obj-c中正确分配和释放对象是很重要的。在我的示例中,我没有分配任何内容,而是将其设置为nil,这是我在取消分配变量时通常执行的操作。所以我的担心是假的。。。我认为字符串可能只是接收到一个随机指针,覆盖另一个对象的指针,迟早会导致崩溃