【问题标题】:Initializing a new string初始化一个新字符串
【发布时间】:2011-12-22 10:47:13
【问题描述】:

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

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 与 @"" 的问题; 我的问题是是否可以简单地使用 NSString = something (nil, @"", @"a value") 并且通常可以对对象执行此操作。 例如,不用NSRandomObject = [[NSRandomObject* alloc] init];,我可以简单地做NSRandomObject = aValue;

【问题讨论】:

    标签: objective-c memory-management


    【解决方案1】:

    由于if 的两个分支都为newString 赋值,所以if 之前的赋值无效。

    决定是否将字符串初始化为nil 还是空字符串是应用程序级别的决定,通常围绕“字符串不存在”和“字符串存在,但它是空的”。

    【讨论】:

    • 当然没有效果,这就是我的想法 :D 我不能使用 NSString* theString = @"something";在 if 中,然后是 else 中的 theString,因为它会告诉我它没有正确声明。这就是我在 if/else 结构之前使用空 init 的原因。
    • @BogdanBucur 如果您覆盖if 两侧的值(即无条件),最好初始化为nil
    • 谢谢,这就是我需要知道的!感谢您的帮助
    【解决方案2】:

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

    事实上,使用stringWithFormat 比简单的@"string" 占用更多的内存

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

    【讨论】:

    • 这真是一个有趣的事实。不过,让我担心的是,我需要先声明变量,然后才能在 if/else 结构中使用它。所以我认为可以将其声明为 nil 或其他什么,然后再给它一个正确的值?
    • 指针的内容总是 4 个字节(或者在 64 位架构上是 8 个字节)。分配一个初始值将写入这 4 个字节,并立即覆盖它意味着您已经写入了 8 个字节。如果这对您非常重要,请不要分配初始值。不过,请务必在之后分配它,然后再使用它。
    • 不,这不是那种需要几个字节真正重要的应用程序。从我之前所见,在 obj-c 中正确分配和释放对象很重要。在我的示例中,我没有分配任何东西,我将它设置为 nil,这是我在释放变量时通常会做的事情。所以我担心的是……我想也许这个字符串迟早会收到一个随机指针,覆盖另一个对象的指针并导致崩溃
    猜你喜欢
    • 2020-11-06
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    相关资源
    最近更新 更多