-1

我有一个应用程序提交到 Apple Store,它通过了。但是我发现有一个错误会使应用程序崩溃。最后,我发现真正的问题是一段代码有相反的结果。

代码:

CGPoint now;
CGPoint old;
UIView *lastDot;
now = dotView.center;
if(lastDot){
    //release version, will go here. then crashed.
    old = lastDot.center;
}else{
    //debug version, will go here. run ok.
}

我声明了一个 UIView 指针,并用“if 语句”检查它,

UIView *lastDot;

调试版本认为 lastDot 为 nil,但发布版本认为不为空。

谁能给我任何想法?谢谢你。

4

2 回答 2

6

根据您的编译器设置,调试构建通常会初始化指向某些标记值的指针,例如0xcccccccc.

UIView *lastDot = nil;

应该按预期工作。

于 2013-01-16T02:27:00.130 回答
1

问题是由于未初始化的指针。

将其初始化为 nil 以避免此类麻烦。

UIView *lastDot = nil;

我知道你已经得到了答案。

我也想补充几点:

指针就像任何其他变量一样:如果您没有明确地将它们设置为一个值,则该值将是未定义的,意味着一个随机值。如果您随后不小心访问了该变量,则可能会发生非常糟糕的事情。

有时人们建议将指针分配给 NULL,通用值意味着“这个指针不指向任何东西”,因为很多代码已经检查了 NULL 指针。例如,如果您调用[nil release],则保证什么也不做。如果你传递了一个未初始化的指针,谁知道会发生什么。

它实际上只是防止程序员错误的一种保护措施。如果您将指针初始化为一个合理的值,那么未初始化的指针在未来某个时候导致系统崩溃的可能性就会降低。

当您不初始化指针然后尝试使用它时,您会遇到 3 个问题:

  • 它可能指向您无权访问的内存,在这种情况下,它会导致分段错误并使您的程序崩溃
  • 它可能指向真实数据,如果你不知道它指向什么,你就会对数据造成不可预测的(并且非常难以调试)的变化。
  • 您无法知道它是否已初始化 - 因为您如何区分有效地址和声明指针时碰巧存在的地址之间的区别?

初始化每个指针以nil严重减少或消除这些问题:

  • 如果我尝试使用它,它仍然会出现段错误,但至少我可以测试它是否为 NULL 并采取相应的行动——我可以知道它会出现段错误,并做其他事情。如果它是一个随机值,那么在它崩溃之前我什么都不知道。
  • 如果您将其初始化为nil,除非我明确告诉它,否则我无法使其指向数据。所以我只修改我的意思。
  • 正如上面所暗示的,我可以知道我什么时候初始化了它,什么时候没有初始化,然后做出决定。

显然这是一个风格问题,并且可以编写一个应用程序,其中变量只初始化为它们的预期值,但我觉得将它们初始化为nil 总是更安全、更容易。即使是最好的程序员也会犯错 -nil更容易知道什么时候发生了错别字。

参考 :

  1. 爱斯基摩人
  2. 始终需要初始化指针
于 2013-01-16T04:24:35.467 回答