Xcode 9中的“此函数声明不是原型”警告

当使用Xcode 9时,有一些编译器警告说This function declaration is not a prototype 。 它build议给方法体添加void ,这将解决它。 我遇到的问题是这些警告也引发系统API像UIApplication委托方法:

 - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler 

这可以通过以下解决:

 - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)(void))completionHandler 

现在我想知道,如果委托方法仍然能够长期工作,或者苹果公司将在以后的iOS 11 Beta版本中插入void 。 我很好奇,因为如果我包括void身体,Xcode会抱怨不匹配的方法select器(这是有道理的)。 到目前为止,有人遇到同样的问题吗?

带空括号的块声明:

 void (^)() 

与具有空括号的函数指针具有相同的语义:

 void (*)() 

这并不意味着没有任何争论。 这意味着这些参数没有被指定,因此可以通过以下方式调用它来打开错误的方式:

 void (^block)() = ... block(); block(10); block(@"myString"); 

声明不带参数的块时,请始终使用:

 void (^)(void) 

苹果没有正确地做到这一点,他们不可能为了兼容性的原因修复旧的API。 你将不得不在那里保持警告,直到你移动到新的API。

您也可以closures该警告( -Wstrict-prototypes ): 在这里输入图像说明

或使用#pragma (谢谢@davidisdk ):

 #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wstrict-prototypes" - (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler { } #pragma clang diagnostic pop 

请参阅此处的LLVM讨论或openradar上的错误。

请注意,API的内部工作没有任何变化,所有的代码仍然可以工作。 我们只会知道API不如应有的。