为什么NSArray不为不存在的索引返回NULL?

Rya*_*los 4 cocoa objective-c nsarray

我理解它的方式之一是关于Objective C的一个特别之处在于你可以将消息发送到NULL并且它将忽略它们而不是崩溃.

为什么如果请求的索引超出范围而不是导致NSRangeException,NSArray不会返回NULL对象?

我对Objective C和NSArray的期望如下.

NSArray *array = [NSArray arrayWithObjects:@"Object 1", @"Object 2", @"Object 3", nil];

for (int i = 0; i < 5; i++) {
    NSString *string  = [array objectAtIndex:i];

    if (string) {
        NSLog(@"Object: %@",string);
    }
}
Run Code Online (Sandbox Code Playgroud)

允许我访问数组的索引,不包含对象,只返回NULL.然后我可以检查对象是否存在.我可以在其他地方执行此操作,例如检查对象是否已实例化.

NSArray *array;

if (!array) {
    array = [NSArray array];
}
Run Code Online (Sandbox Code Playgroud)

我意识到这是一个基于理论的问题,但我很好奇:)

bbu*_*bum 9

消息到nil是语言级功能,而不是框架API功能.

那个NSArray(以及其他类)抛出异常来指示程序员错误是在设计API时做出的有意识的设计决策(~1993).正如凯文和理查德所指出的那样,nil eats message无论如何都不是错误的,而是out of bounds非常错误的输入.

你会在哪里划线?应该substringWithRange:接受任何旧的输入?怎么样setObject:atIndex:

通过使NSArray @throw在边界上的异常indexOfObject:使得API保持一致; 任何超出范围的索引(或范围)都将@throw.

  • 当然——API 设计有很多微妙之处。在许多情况下,当放在更大的背景下时,看似奇怪的决定很有意义。API设计和语言设计*难*做好! (2认同)