2014-01-10 31 views
1

代码:如何沉默Xcode 64位/ 32位警告,或更好的解决它们?

#define ASSERT_INDEX_IS_WITHIN_BOUNDS(idx,array) 
    NSAssert2(idx >= 0 && idx <= (self.array.count-1), @"index %d beyond bounds [0 .. %d]", idx, (self.array.count-1)) 

上述宏导致以下警告:类型NSUInteger'的

值不应该被用作格式参数;相反,将明确的强制转换添加到'unsigned long'。

这是第三方代码,并有负载这些。我如何沉默/修复它们?

+0

只适用于32位? –

+0

@MichaelDautermann针对iPhone 5S。 – duci9y

+1

从长远来看,最好让它们得到修复;) –

回答

3

,您仍然可以运行在iPhone 5S构建它只有32位应用程序,因为iPhone 5S将运行现有的32位应用程序。许多应用程序需要等待开始构建64位,直到库供应商更新他们的代码来修复64位问题,并且在静态库甚至包含64位构建代码的情况下。

真的没有任何理由你绝对需要你的代码在64位运行,现在我可以看到,即使你做了,也不能保证你使用的第三方库的稳定性。所以我建议你暂时坚持只构建32位,并且它可以在iPhone 5S上运行得很好。

如果你因为某些原因没有绝对需要能够建立你的应用程序为64位,你要么必须得到库供应商更新他们的代码,或者你必须删除它,然后写你自己的代码来处理他们正在做的事情。

编辑:

要解决这个确切的警告,在它具有%d斑点,与%lu替换它们。

+0

我已经切换到32位:P但我仍然好奇这是如何解决的,因为它只是一个警告。 – duci9y

+0

警告可能是严重的问题。仅仅因为它仍然可以让你编译它并不意味着它可以正常运行,或者根本不会。事实上即使没有任何警告的代码仍然无法工作。至于警告是在抱怨什么,在这种特殊情况下,它似乎只是来自正在使用的格式字符串。但是,如果它是第三方的代码,那么您可能希望他们修复它,否则如果进行更改并稍后想要使用其更新版本,同时保留一些更改,则会产生很大的混乱。 – Gavin

+0

这就是一般的警告和编码实践。我只想知道这个特定的警告是否可以永久固定/保持沉默。 – duci9y

0

使用NSInteger/NSUInteger可能会解决您的隐式转换警告。

我一直在我的代码中使用int/long类型。如果你需要同时支持32位和64位处理器,这是解决这一

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64 
    typedef long NSInteger; 
    typedef unsigned long NSUInteger; 
#else 
    typedef int NSInteger; 
    typedef unsigned int NSUInteger; 
#endif 

你可以从NSObjCRuntime.h看到它的NS类型转换为/长基础上,LP64无符号/有符号整数的一种方式(64bit)标志

希望有所帮助。