在iOS上,if()语句在发行版和调试版之间有不同的结果

时间:2013-01-16 02:20:43

标签: iphone ios pointers if-statement

我有一个提交到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 statement”,

进行检查

UIView * lastDot;

调试版本将lastDot视为nil,但发布版本认为不为null。

任何人都可以给我任何想法吗?谢谢。

2 个答案:

答案 0 :(得分:6)

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

UIView *lastDot = nil;

应该按预期工作。

答案 1 :(得分:1)

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

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

UIView *lastDot = nil;

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

我只是想补充一点:

  

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

     

有时人们建议将指针指定为NULL,即   普遍价值意义“这个指针不指向任何东西”,   因为很多代码已经检查了NULL指针。例如,   如果你打电话给[nil release],保证什么都不做。如果你   传递了一个未初始化的指针,知道会发生什么。

     

这实际上只是防范程序员错误的一种方法。如果你   将指针初始化为合理的值,它不太可能   未初始化的指针将导致系统崩溃   将来

     

当你没有初始化指针然后尝试使用它时,你有3个   问题:

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

初始化指向nil的每个指针都会严重减少或消除   那些问题:

     
      
  • 如果我尝试使用它,它仍会是段错误,但至少我可以测试它是否为NULL并采取相应的行动 - 我可以知道它会段错误,   并做点别的事。如果它是随机值,我什么都不知道   直到它崩溃。
  •   
  • 如果您将其初始化为nil,我无法指出数据,除非我明确告诉它。所以我只修改我的意思。
  •   
  • 如上所述,我可以告诉我何时初始化它以及什么时候没有,并做出决定。
  •   
     

显然这是一种风格问题,有可能写一个   应用程序,其中变量仅初始化为其预期   价值,但我觉得将它们初始化为nil更安全,更容易   总是。即使是最优秀的程序员也会犯错字错误 - nil会让错误更容易   知道什么时候发生了。

参考:

  1. eskimo
  2. Initializing pointers always necessary