我有一个提交到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。
任何人都可以给我任何想法吗?谢谢。
答案 0 :(得分:6)
根据您的编译器设置,调试版本通常会初始化指向某些标记值的指针,如0xcccccccc
。
UIView *lastDot = nil;
应该按预期工作。
答案 1 :(得分:1)
问题是由于未初始化的指针。
将其初始化为零以避免此类麻烦。
UIView *lastDot = nil;
我知道你已经得到了答案。
我只是想补充一点:
指针就像任何其他变量一样:如果没有明确设置 它们为一个值,该值将是undefined意味着一个随机值。如果 然后你不小心访问变量,可能会发生非常糟糕的事情。
有时人们建议将指针指定为NULL,即 普遍价值意义“这个指针不指向任何东西”, 因为很多代码已经检查了NULL指针。例如, 如果你打电话给
[nil release]
,保证什么都不做。如果你 传递了一个未初始化的指针,知道会发生什么。这实际上只是防范程序员错误的一种方法。如果你 将指针初始化为合理的值,它不太可能 未初始化的指针将导致系统崩溃 将来
当你没有初始化指针然后尝试使用它时,你有3个 问题:强>
- 它可能指向您无权访问的内存,在这种情况下会导致分段错误并导致程序崩溃
- 它可能指向真实数据,如果你不知道它指向的是什么,你就会造成不可预测的(并且很难调试) 更改您的数据。
- 您无法知道它是否已初始化 - 因为您如何区分有效地址和地址之间的区别 当你宣布指针时碰巧在那里?
初始化指向
nil
的每个指针都会严重减少或消除 那些问题:
- 如果我尝试使用它,它仍会是段错误,但至少我可以测试它是否为NULL并采取相应的行动 - 我可以知道它会段错误, 并做点别的事。如果它是随机值,我什么都不知道 直到它崩溃。
- 如果您将其初始化为
nil
,我无法指出数据,除非我明确告诉它。所以我只修改我的意思。- 如上所述,我可以告诉我何时初始化它以及什么时候没有,并做出决定。
显然这是一种风格问题,有可能写一个 应用程序,其中变量仅初始化为其预期 价值,但我觉得将它们初始化为
nil
更安全,更容易 总是。即使是最优秀的程序员也会犯错字错误 -nil
会让错误更容易 知道什么时候发生了。
参考: