objective-c – 为什么要使用id,当我们可以只使用NSObject?

objective-c – 为什么要使用id,当我们可以只使用NSObject?,第1张

概述我知道,当我们要创建一个未知的值对象时,我们使用id。然而,我很好奇为什么苹果选择id,它决定了它的价值在运行时,当每个对象是NSObject的子类。所以,而不是id委托我们可以使用NSObject *委托有没有人知道为什么?谢谢。 id删除类型,它等效于说“这个对象响应任何翻译可见的选择器”。当然,它是你的责任,以确保你的程序是正确的,当你擦除类型(以及当你typecast它们)。 如果类型是N 我知道,当我们要创建一个未知的值对象时,我们使用ID。然而,我很好奇为什么苹果选择ID,它决定了它的价值在运行时,当每个对象是NSObject的子类。所以,而不是ID委托我们可以使用NSObject *委托有没有人知道为什么?谢谢。解决方法 ID删除类型,它等效于说“这个对象响应任何翻译可见的选择器”。当然,它是你的责任,以确保你的程序是正确的,当你擦除类型(以及当你typecast它们)。

如果类型是NSObject,那么如果选择器未在NSObject的接口或其所采用的协议中声明,则编译器会说“NSObject可能不响应选择器”。在这种情况下,您还可以添加一个类型转换,将其转换为您期望的类型。

使用严格/正确的类型,编译器可以引入并帮助你,这是伟大的,因为ObjC是一个非常动态的语言。

ID在使用(或构建)集合类型时特别有用。添加对象不会是一个问题,除非你定义了一个新的根类型(不继承NSObject)。从集合中获取值需要类型转换,如果我们使用它作为除了我们的基类(NSObject)之外的东西。

Objective-C不支持泛型 – 例如,不能声明Nsstrings的NSArray。你可以使用Nsstrings填充NSArray,并且当类型安全性不被保留时,通过ID传递一个更自然的书写风格。

所以,让我们用一些真正的代码展开。

实施例A

Nsstring * string = [array objectAtIndex:0]; // << trust me (via ID)return [string length];-or-return [[array objectAtIndex:0] length]; // << trust me (via ID)

实施例B

现在让我们说ID不可用,我们修复所有的编译器警告,因为它是正确的事情:

Nsstring * string  = (Nsstring*)[array objectAtIndex:0]; // << typecast == trust mereturn [string length];-or-return [(Nsstring*)[array objectAtIndex:0] length]; // << typecast == trust me

ID不在运行时决定它的值,也没有任何NSObject。 ObjC对象不执行隐式促销,他们只是投射指针通过没有正式促销。

与您的示例相关,我实际上声明我的委托和参数为NSObjects与协议:

NSObject<MONShapeDelegate>* delegate;
总结

以上是内存溢出为你收集整理的objective-c – 为什么要使用id,当我们可以只使用NSObject?全部内容,希望文章能够帮你解决objective-c – 为什么要使用id,当我们可以只使用NSObject?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1044592.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存