2009-12-14 96 views
3

有谁知道,如果下面的代码可能是有问题的:的Objective-C:初始化变量为零

NSString *addchar = nil; 

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

假设姓和全名不为空或空。初始化NSString对象并将其设置为'nil'会导致一些可能的问题?它似乎会导致我的应用程序冻结,但仅限于少数用户,并且仅限于那些用户,但它与任何输入字符串或空字符串没有任何关系。所以我试图孤立的问题,但我不知道

NSString *addChar; 

NSString *addChar = nil; 

感谢之间的差异。

回答

7

两种形式都完全可以接受。你遇到的问题在别处。我建议使用仪器进行一些代码分析以找出发生此问题的位置。

+0

谢谢。这是令人沮丧的,因为我无法自己再现问题(它与我有的应用程序一起),它只影响一个小组,并且不会导致崩溃......它只会挂起......所以它不会生成一个崩溃日志。所以我不知道如何去追踪它。即使苹果的工程师似乎也无法找到问题。 – 2009-12-14 22:06:43

+0

如果此代码在静态方法内运行,这有什么关系吗? – 2009-12-15 18:21:10

1

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

this place查看相关问题。

+0

什么编译器将它初始化为未定义。在实践中,这将是随机垃圾。 – Chuck 2009-12-14 21:50:55

+0

是的,我意识到我的表述并不完全清楚......它实际上取决于变量的范围(有些情况下它会保证被初始化)。 – Romain 2009-12-14 21:52:45

5

如果没有零初始化器,在某些情况下,您的变量可能会被垃圾初始化(无论以前是否在内存空间中)。关于哪些类型的变量(基于范围,静态存储等)有自动为你自动初始化的特定规则,但我总是发现,明确初始化所有变量而不是记住这些规则会更容易。

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

2

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

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

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

输出:

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

当然我并不需要调用description明确,我只是演示调用nil