在目标c中,当我有方法(例如)返回/作为NSInteger的参数时,我经常在编译器中遇到警告,而我将参数放置为long int / NSNumber / etc值或者变量。编码编译得很好,但我总是很想做演员,因为这些警告让我感到不安。我知道它可能不会产生很大的不同,但是是否会抛出处理这些警告的首选方式?
答案 0 :(得分:1)
如果警告只是一个演员问题,那么一定要添加演员。很多时候Xcode对此非常有帮助。
很多时候,最好的答案是更改声明的类型,因此既没有错误也没有警告。示例:您已将变量声明为int
。一种方法期待NSInteger
。而不是强制转换将变量的声明更改为NSInteger
。
但请注意,例如将NSNumber
转换为NSInteger
将无法解决任何问题,因为@Josh指出它们是非常不同的东西。
消除所有警告!然后,当出现新的时,很明显。如果有警告,则代码编译不正确。
注意:有时需要使用#pragma
消除个别警告,但这些警告非常罕见,只有在完全理解原因时才会这样做。示例:我需要能够在应用程序中导致测试崩溃,该代码导致警告,添加#pragma
以消除警告。
同时运行Analyzer并修复那里的任何警告。
警告是有原因的,它们有助于发现错误。
答案 1 :(得分:1)
int
,NSInteger
和NSUInteger
是标量。 NSNumber
是一个对象。它们彼此无关,并且在它们之间进行投射以隐藏编译器中的这一事实将带来灾难。
请记住,强制转换意味着您抛弃了编译器检查您正在做正确事情的能力。您可以使用强制转换来欺骗编译器,就好像对它说:“别担心,一切都会好的。”不要欺骗编译器!如果你这样做,那么当应用程序运行时,你会在最糟糕的情况下得到废话,最好是崩溃。 (崩溃是最好的,因为它会阻止你死亡;不会崩溃意味着你现在有一个很大的错误,以后很难追查。)