考虑下面的方法

- (void)methodWithArg:(NSString *)arg1 andArg:(NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;

有了新的nonnullnullable annotation keywords,我们可以对其进行如下丰富:

- (void)methodWithArg:(nonnull NSString *)arg1 andArg:(nullable NSString *)arg2 completionHandler:(void (^)(NSArray *results, NSError *error))completionHandler;

但我们也收到了这样的警告:

指针缺少nullability类型说明符(_nonnull或

它指的是第三个参数(块1).

documentation没有包括如何指定块参数的可空性的示例.它一字不差地陈述

您可以立即使用非下划线形式null和nonnull

我试着在没有任何运气的情况下(在任何位置)为块放置两个关键字中的一个.还try 了下划线前缀的变体(__nonnull__nullable).

因此,我的问题是:如何为块参数指定可空性语义?

推荐答案

这似乎奏效了

- (void)methodWithArg:(nonnull NSString *)arg1 
  andArg:(nullable NSString *)arg2 completionHandler:(nullable void (^)
  (NSArray * _Nullable results, NSError * _Nonnull error))completionHandler

您需要为块及其参数指定可空性...

编辑:有关更多信息,请参阅Swift Blog

Objective-c相关问答推荐

如何判断 iPhone 现在在哪个位置(横向或纵向)?

如何在没有 Interface Builder 的情况下创建 Cocoa 接口?

将类作为参数传递?

performSelector 的返回值:

NSTimeZone:localTimeZone 和 systemTimeZone 有什么区别?

是否需要 ARC 中的 NSNotificationCenter removeObserver?

对 nil 对象进行快速枚举

如何以编程方式暂停 NSTimer?

如何初始化 NSString 的数组?

检测代码是否在 Objective-C 的主线程上运行的正确方法是什么? (iOS)

如何用 Java 开发 iPhone 应用程序?

AdMob 因 [GADObjectPrivate changeState:] 崩溃:无法识别的 Select 器

更改 UISearchBar 的字体大小

显示启动画面的时间超过默认秒数

Xcode 在您的 keys 串中找不到此配置文件的有效私有证书/有效密钥对

Objective-C构建中的重复符号错误?

协议和代表之间的区别?

在objective c中以自定义格式获取当前时间

使 UILabel 的文本加粗

iPhone - dequeueReusableCellWithIdentifier 用法