ios - Xcode 9 中的 "This function declaration is not a prototype"警告

标签 ios objective-c xcode ios11 xcode9-beta

使用 Xcode 9 时,有一些编译器警告说 This function declaration is not an prototype。它建议将 void 添加到方法体中,这将解决它。我遇到的问题是,这些警告也会针对系统 API 引发,例如 UIApplication 委托(delegate)方法:

- (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

现在我想知道委托(delegate)方法是否仍然可以长期使用,或者 Apple 会在以后的 iOS 11 Beta 版本中插入 void。我很好奇,因为如果我包含 void 主体,Xcode 会提示方法选择器不匹配(这是有道理的)。到目前为止,有人遇到过同样的问题吗?

最佳答案

带空括号的 block 声明:

void (^)()

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

void (*)()

这并不意味着没有参数。这意味着未指定参数,因此它为错误打开了道路,因为您可以通过以下方式调用它:

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

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

void (^)(void)

Apple 并没有在所有地方都正确地做到这一点,并且出于兼容性原因,他们可能不会为旧 API 修复该问题。在迁移到较新的 API 之前,您必须保留该警告。

您也可以关闭该警告(-Wstrict-prototypes): enter image description here

或使用 #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 讨论 hereopenradar 上的错误.

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

关于ios - Xcode 9 中的 "This function declaration is not a prototype"警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44473146/

相关文章:

ios - NSAttributedString 对于自动调整异常无效

c# - iOS 设备上缺少日期时间解析

ios - ionic 2 后请求不起作用

ios - 导入 UIKit 或 CoreGraphics?

ios - 添加 Flurry 库后的链接器错误

iphone - 在Xcode中,哪种音频文件类型可以无缝循环?

ios - 进入 Parse 的空文件

ios - 核心运动事件是否与核心位置有关

objective-c - 如何以编程方式强制在 UISearchBar 中进行搜索?

ios - 嵌入的 Segue 目标 View Controller 被排除在 UI 状态恢复之外