gpt4 book ai didi

Objective-C 理解 isKindOfClass

转载 作者:行者123 更新时间:2023-12-04 03:07:15 24 4
gpt4 key购买 nike

最新版本的 Objective-C 和 XCode (4.4)。

我有一个代码片段,我不明白为什么我可以使用一些行,让我解释一下:

// For understanding purpose : (NSMutableArray*)_programStack

id l_topItemOnStack = [_programStack lastObject];
if([l_topItemOnStack isKindOfClass:[NSNumber class]])
{
return [l_topItemOnStack doubleValue];
}

我的问题:因为我的 l_topItemOnStackid 类型,而且我没有将它转换成 NSNumber,我怎么能使用 [l_topItemOnStack doubleValue]

我猜我必须先将它转换为 NSNumber 才能访问 NSNumber 方法...

我在这里错过了什么?

最佳答案

因为 Objective-C 是一种动态语言,消息名称及其声明只是编译器的提示 - 实际的消息查找和发送发生在运行时。因此,即使编译器不知道您的对象响应 doubleValue 消息,它仍然能够让您调用

return objc_msgSend(l_topItemOnStack, @selector(doubleValue));

像往常一样。

此外,编译器查找在包含的 header 中任何位置声明的所有选择器,并尝试使用实际上下文找到最佳匹配 - 这里 doubleValue 是一个唯一的名称 - 它仅在 NSNumber 上声明,因此编译器 < em>假定您的对象确实是一个 NSNumber。

如果你真的想避免这种情况,要么在调用方法时强制转换对象,要么一开始就将其声明为 NSNumber。

关于Objective-C 理解 isKindOfClass,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12173711/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com