代码之家  ›  专栏  ›  技术社区  ›  Z S

目标C:将变量初始化为零

  •  3
  • Z S  · 技术社区  · 15 年前

    是否有人知道以下代码可能有问题:

    NSString *addchar = nil;
    
    if (case1)
    addChar = [[firstname substringToIndex:1] capitalizedString];
    else
    addChar = [[fullname substringToIndex:1] capitalizedString];
    

    假定firstname和fullname不为空。初始化nsstring对象并将其设置为“nil”是否会导致一些可能的问题?它似乎会导致我的应用程序冻结,但只针对少数用户,而且只针对那些用户,但它与不同的输入字符串或空字符串没有任何关系。所以我想把问题孤立起来,但我不知道两者之间的区别

    NSString *addChar;
    

    NSString *addChar = nil;
    

    谢谢。

    5 回复  |  直到 10 年前
        1
  •  7
  •   Joshua Nozzi    15 年前

    任何一种形式都是完全可以接受的。你的问题在别的地方。我建议使用工具进行一些代码分析,以找出此问题发生的位置。

        2
  •  5
  •   Steven Schlansker    15 年前

    如果没有nil初始值设定项,在某些情况下,可以用垃圾(以前内存空间中的任何内容)初始化变量。关于哪些类型的变量(基于作用域、静态存储等)自动初始化为零,有一些特定的规则,但我始终发现,显式初始化所有变量而不是记忆这些规则更容易。

    也就是说,因为if语句的两个分支都会删除addchar的任何先前值,所以在任何情况下都不应该看到无效的值。但是明确地初始化为nil肯定不会伤害任何东西,如果将来的维护人员来更改代码路径,您可能会发现初始值设定项会拯救您!

        3
  •  2
  •   stefanB    15 年前

    如果变量未初始化,则应始终初始化为nil,否则。

    您可以将消息发送到nil,它们将被忽略。

    NSString * str = nil;
    NSLog(@"%@", [str description]);
    

    输出:

    2009-12-15 08:59:03.352 x[11775] (nil)
    

    当然我不需要打电话 description 明确地说,我只是在演示 nil .

        4
  •  1
  •   Community Heathro    7 年前

    这里没有区别,因为你不读书 addChar 在您的代码中。此外,编译器有时可以初始化 阿德查尔 nil 如果你不明确地做这件事(取决于 阿德查尔 的声明)。

    参见相关问题 this place .

        5
  •  0
  •   Community Heathro    7 年前

    从现在开始,当使用ARC时,强、弱和自动释放堆栈变量初始化为 nil :

    https://developer.apple.com/library/ios/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011226-CH1-SW5

    此外,从时代开始,在objc中,实例变量初始化为零:

    Are instance variables set to nil by default in Objective-C?