问题 这是什么(NSNull *)控制器== [NSNull null]应该做什么?为什么不只是控制器==零?


在Apple的例子中,我看到了这个:

myController *controller = [viewControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null]) {
    controller = [[myController alloc] initWithPageNumber:page];
    [viewControllers replaceObjectAtIndex:page withObject:controller];
    [controller release];
}

我对这一行非常感兴趣:

if ((NSNull *)controller == [NSNull null]) {

如果我愿意这样做,我会检查是否为零。他们为什么这样做太复杂了?那到底是做什么的?对我来说,看起来他们正在将控制器对象转换为NSNull,然后检查它是否与NSNull中的null相同。

据我所知。 nil表示“无对象”,null表示“无”。请帮我看清楚图片吧!


12857
2018-05-13 21:48


起源



答案:


大多数容器不允许将'nil'对象插入其中。如果您确实想在容器中插入空值,则可以使用NSNull实例(NSNull是单例)。

在您的特定示例中,控制器是从数组中获取的。然后,确保对象不是NSNull实例是一种好习惯。


12
2018-05-13 21:53



谢谢。那么(NSNull *)控制器是否将控制器转换为NSNull?我想是有一个isKindOfClass运算符或类似的东西。 - Thanks
执行指针比较比调用isKindOfClass更快(运行时),但这应该工作,就像执行[controller isEqual:[NSNull null]]一样。如果您已声明控制器 id,你甚至不需要强制转换来避免编译器警告。 - Daniel Dickison


答案:


大多数容器不允许将'nil'对象插入其中。如果您确实想在容器中插入空值,则可以使用NSNull实例(NSNull是单例)。

在您的特定示例中,控制器是从数组中获取的。然后,确保对象不是NSNull实例是一种好习惯。


12
2018-05-13 21:53



谢谢。那么(NSNull *)控制器是否将控制器转换为NSNull?我想是有一个isKindOfClass运算符或类似的东西。 - Thanks
执行指针比较比调用isKindOfClass更快(运行时),但这应该工作,就像执行[controller isEqual:[NSNull null]]一样。如果您已声明控制器 id,你甚至不需要强制转换来避免编译器警告。 - Daniel Dickison


集合类就像 NSArray 和 NSDictionary 不能包含 nil 值。你的伊娃, viewController,是集合类的实例。 NSNULL 是专门创建的占位符 nil,你可以将它放入集合类中。

NSNull class定义了一个单例对象,这意味着只有一个实例 NSNull (你用它创建的 [NSNull null]),但它可以在任何地方使用你想要的。


1
2017-07-03 05:16