如果类型是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?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)