当前位置:  开发笔记 > IOS > 正文

声明变量"id"和"NSObject*"之间有什么区别?

如何解决《声明变量"id"和"NSObject*"之间有什么区别?》经验,为你挑选了3个好方法。

在Objective-C中,声明变量id与声明变量之间的区别是什么NSObject *



1> Chuck..:

使用变量类型id,您可以发送任何已知消息,编译器不会抱怨.对于变量类型NSObject *,您只能发送它由NSObject声明的消息(不是任何子类的方法),否则它将生成警告.一般来说,id就是你想要的.

进一步说明:所有对象基本上都是类型id.声明静态类型的要点是告诉编译器"假设此对象是此类的成员".因此,如果你发送一个类没有声明的消息,编译器可以告诉你,"等等,那个对象不应该得到那个消息!" 此外,如果两个类具有相同名称但签名不同的方法(即参数或返回类型),则可以猜出您为变量声明的类所指的方法.如果它被声明为id,编译器将只是举起手来告诉你,"好的,我这里没有足够的信息.我随机选择方法签名." (但这通常无法通过声明来帮助NSObject*.


很好的解释,虽然我不愿意说"一般来说,id就是你想要的".虽然"id"由于动态类型而非常灵活,但它几乎不提供任何警告,因此如果调用不受支持的方法,则在编译时捕获的内容将成为运行时问题.明智地使用静态类型(使用MyClassName*等)可以简化生活,特别是在Xcode中调试时(它可以显示对象的更智能的摘要)或者使用拼写错误或不完整的选择器捕获方法调用.

2> 小智..:

id表示"对象",NSObject *表示" NSObject其子类的实例或其中一个".Objective-C中有些对象不是NSObjects(目前你在Cocoa中遇到的对象是NSProxy,ProtocolClass).如果某些代码需要特定类的对象,则声明这有助于编译器检查您是否正确使用它.如果你真的可以使用"任何对象" - 例如你宣布一个委托并将使用respondsToSelector:调用测试所有方法发送- 你可以使用id.

声明对象变量的另一种方法是" id ",这意味着"任何实现NSObject协议的对象.



3> Julien Chast..:

根据我对Objective-C的有限理解,并非所有对象都是从NSObject派生的(与所有对象派生自Object的Java不同).理论上你可以有其他的根对象.id可以应用于任何非NSObject派生对象.

推荐阅读
手机用户2402852307
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有