我应该使用NSInteger,NSNumber和NSUinteger吗?

时间:2014-01-12 20:59:22

标签: objective-c macos cocoa

在目标c中,当我有方法(例如)返回/作为NSInteger的参数时,我经常在编译器中遇到警告,而我将参数放置为long int / NSNumber / etc值或者变量。编码编译得很好,但我总是很想做演员,因为这些警告让我感到不安。我知道它可能不会产生很大的不同,但是是否会抛出处理这些警告的首选方式?

2 个答案:

答案 0 :(得分:1)

如果警告只是一个演员问题,那么一定要添加演员。很多时候Xcode对此非常有帮助。

很多时候,最好的答案是更改声明的类型,因此既没有错误也没有警告。示例:您已将变量声明为int。一种方法期待NSInteger。而不是强制转换将变量的声明更改为NSInteger

但请注意,例如将NSNumber转换为NSInteger将无法解决任何问题,因为@Josh指出它们是非常不同的东西。

消除所有警告!然后,当出现新的时,很明显。如果有警告,则代码编译不正确。

注意:有时需要使用#pragma消除个别警告,但这些警告非常罕见,只有在完全理解原因时才会这样做。示例:我需要能够在应用程序中导致测试崩溃,该代码导致警告,添加#pragma以消除警告。

同时运行Analyzer并修复那里的任何警告。

警告是有原因的,它们有助于发现错误。

答案 1 :(得分:1)

intNSIntegerNSUInteger是标量。 NSNumber是一个对象。它们彼此无关,并且在它们之间进行投射以隐藏编译器中的这一事实将带来灾难。

请记住,强制转换意味着您抛弃了编译器检查您正在做正确事情的能力。您可以使用强制转换来欺骗编译器,就好像对它说:“别担心,一切都会好的。”不要欺骗编译器!如果你这样做,那么当应用程序运行时,你会在最糟糕的情况下得到废话,最好是崩溃。 (崩溃是最好的,因为它会阻止你死亡;不会崩溃意味着你现在有一个很大的错误,以后很难追查。)