objective-c:将变量初始化为nil

时间:2009-12-14 21:45:31

标签: iphone objective-c

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

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;

感谢。

5 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:5)

如果没有nil初始值设定项,在某些情况下,您的变量可能会使用垃圾进行初始化(无论以前在内存空间中是什么)。关于哪些类型的变量(基于范围,静态存储等)是自动初始化的,有一些特定的规则,但我总是发现显式初始化所有变量而不是记住这些规则更容易。

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

答案 2 :(得分:2)

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

您可以将消息发送到零,但会忽略它们。

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

输出:

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

当然,我不需要明确致电description,我只是在向nil展示电话。

答案 3 :(得分:1)

此处没有区别,因为您未在代码中阅读addChar。此外,如果您没有明确地执行此操作,编译器有时可能会为您初始化addChar nil。(取决于addChar声明的范围)。

请参阅this place上的相关问题。

答案 4 :(得分:0)

从现在开始,当您使用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?