Return 发送到 nil 的方法不是 nil

Return something other than nil from a method sent to nil

这对于一个类别来说可能是不可能的,但为了以防万一它是可行的,我想找出答案。

我在 NSString 上写了一个类别,我有一个类别方法可以将逗号分隔的字符串解析为 NSArray 清理多余的逗号和空格,并修剪结尾...等等比类似功能的内置方法全面。不过问题来了……如果字符串是 nil 怎么办?有什么办法可以 return 初始化 NSArray 与 0 个对象而不是 returning nil?

场景会是这样的...

NSArray *parsed = [someString parseStringIntoArray];

...假设 someStringnil。我能以某种方式从中得到一个初始化数组吗?

显然有很多方法可以解决这个问题,但要保持简洁明了,并使用类别方法...这可能吗?

没有。但是,是的,如果您进行一些更改:

因为你调用的是实例方法,所以这行不通。当您向 nil 发送消息(也就是调用 nil 对象的方法)时,您将始终收到 nil。 这就是 nil 本身的关键概念。

例如,您可以添加一个 class 方法,然后在此 class 方法中,您可以针对 nil 和 return 测试一个空数组:

+ (NSArray *)parseStringIntoArray:(NSString *)string {
    return [string componentsSeparatedByString:@","] ?: @[];
}

或者您可以简单地使用 NSString 内置的内容:

NSArray *parts = [@"foo,bar,la,le,lu" componentsSeparatedByString:@","] ?: @[];

编辑

不,无法从发送到 nil 的消息中 return 任何内容。这是融入运行时的核心:objc_msgSend() is responsible for this behavior

如果接收者是 nilobjc_msgSend() 将表达式解析为方法的 return 类型的适当 0 值。

您必须在之前或之后测试 nil 并手动更改数组的值。

(顺便说一下,这是一个类别方法这一事实是无关紧要的。)