【问题标题】:objective-c: initialize variable to nil目标-c:将变量初始化为零
【发布时间】:2010-12-26 14:22:45
【问题描述】:

有谁知道下面的代码是否有问题:

NSString *addchar = nil;

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

假设 firstname 和 fullname 不为 null 或为空。初始化 NSString 对象并将其设置为“nil”是否会导致一些可能的问题?它似乎导致我的应用程序冻结,但仅针对极少数用户,并且仅针对那些用户,但它与不同的输入字符串或空字符串没有任何关系。所以我试图隔离问题,但我不知道之间的区别

NSString *addChar;

NSString *addChar = nil;

谢谢。

【问题讨论】:

    标签: iphone objective-c


    【解决方案1】:

    从现在开始,当您使用 ARC 时,strong、weak 和 autoreleasing 堆栈变量被初始化为 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?

    【讨论】:

      【解决方案2】:

      这里没有区别,因为您没有在代码中读取addChar。此外,编译器有时可能会为您初始化addCharnil,如果您不明确这样做(取决于addChar 声明的范围)。

      this place查看相关问题。

      【讨论】:

      • 未定义编译器将其初始化为什么。在实践中,这将是随机垃圾。
      • 是的,我意识到我的表述并不完全清楚......它实际上取决于变量的范围(在某些情况下它可以保证被初始化)。
      【解决方案3】:

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

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

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

      输出:

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

      当然我不需要显式调用description,我只是在演示对nil的调用。

      【讨论】:

        【解决方案4】:

        如果没有 nil 初始化器,在某些情况下,您的变量可能会被垃圾初始化(无论之前在内存空间中的什么)。对于哪些类型的变量(基于范围的、静态存储等)会自动为您进行零初始化,有一些特定的规则,但我一直发现显式初始化所有变量比记住这些规则更容易。

        也就是说,因为 if 语句的两个分支都破坏了 addChar 的任何先前值,所以在任何情况下都不应该看到无效值。但是,显式初始化为 nil 肯定不会有任何损害,如果未来的维护者出现并更改代码路径,您可能会发现初始化程序可以节省您的时间!

        【讨论】:

          【解决方案5】:

          任何一种形式都是完全可以接受的。您遇到的问题在其他地方。我建议使用 Instruments 进行一些代码分析,以找出出现此问题的位置。

          【讨论】:

          • 谢谢。这令人沮丧,因为我自己无法重现该问题(它与我拥有的应用程序有关)并且它只影响一小部分人,并且不会导致崩溃......它只会挂起......所以它不会生成崩溃日志。所以我不知道如何追踪它。就连 Apple 的工程师似乎也找不到问题所在。
          • 这段代码是否在静态方法中运行有关系吗?
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-07-26
          • 1970-01-01
          相关资源
          最近更新 更多