5

我理解它的方式,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);
    }
}

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

NSArray *array;

if (!array) {
    array = [NSArray array];
}

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

4

2 回答 2

10

Messages to nil 是语言级别的功能,而不是框架 API 功能。

那个NSArray(和其他类)抛出异常以指示程序员错误是在设计 API 时(~1993 年)做出的有意识的设计决定。正如 Kevin 和 Richard 所指出的,nil eats message无论如何都不是错误的,而out of bounds在很大程度上是错误输入的情况。

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

通过使 NSArray @throw on bounds 异常,indexOfObject:它使 API 保持一致; 任何超出范围的索引(或范围)都将@throw.

于 2012-05-21T20:12:04.920 回答
2

您可以使用 anNSMutableDictionary来完成您正在尝试做的事情。将键设置为NSNumber索引。调用objectForKey不存在的键(超出我们想象的界限或已删除)将返回 nil。

于 2012-05-21T20:12:39.490 回答