做网站走啥科目,网站建设客户合同范本,德州制作网站哪家最专业,seo公司广州我们常常会混淆下面三种申明#xff08;我是没有留意过#xff09;#xff1a; 1. id foo1; 2. NSObject *foo2; 3. idNSObject foo3;第一种是最经常使用的#xff0c;它简单地申明了指向对象的指针#xff0c;没有给编译器不论什么类型信息#xff… 我们常常会混淆下面三种申明我是没有留意过 1. id foo1; 2. NSObject *foo2; 3. idNSObject foo3; 第一种是最经常使用的它简单地申明了指向对象的指针没有给编译器不论什么类型信息因此编译器不会做类型检查。但也由于是这样你能够发送不论什么信息给id类型的对象。这就是为什么alloc返回id类型但调用[[Foo alloc] init]不会产生编译错误。 因此id类型是执行时的动态类型编译器无法知道它的真实类型即使你发送一个id类型没有的方法也不会产生编译警告。 我们知道id类型是一个Objective-C对象但并非都指向继承自NSOjbect的对象即使这个类型和NSObject对象有非常多共同的方法像retain和release。要让编译器知道这个类继承自NSObject一种解决的方法就是像第2种那样使用NSObject静态类型当你发送NSObject没有的方法像length或者count时编译器就会给出警告。这也意味着你能够安全地使用像retainreleasedescription这些方法。 因此申明一个通用的NSObject对象指针和你在其他语言里做的类似像java但其他语言有一定的限制没有像Objective-C这样灵活。并非全部的Foundation/Cocoa对象都继承息NSObject比方NSProxy就不从NSObject继承所以你无法使用NSObject指向这个对象即使NSProxy对象有release和retain这种通用方法。为了解决问题这时候你就须要一个指向拥有NSObject方法对象的指针这就是第3种申明的使用情景。 id告诉编译器你不关心对象是什么类型但它必须遵守NSObject协议(protocol)编译器就能保证全部赋值给id类型的对象都遵守NSObject协议(protocol)。这种指针能够指向不论什么NSObject对象由于NSObject对象遵守NSObject协议(protocol)并且它也能够用来保存NSProxy对象由于它也遵守NSObject协议(protocol)。这是很强大方便且灵活你不用关心对象是什么类型而仅仅关心它实现了哪些方法。 如今你知道你要用什么类型了不 假设你不须要不论什么的类型检查使用id它常常作为返回类型也常常常使用于申明代理(delegate)类型。由于代理类型通常在执行时才会检查是否实现了那些方法。 假设真的须要编译器检查那你就考虑使用第2种或者第3种。非常少看到NSObject能正常执行但id无法正常执行的。使用协议(protocol)的长处是它能指向NSProxy对象而更经常使用的情况是你仅仅想知道某个对象遵守了哪个协议而不用关心它是什么类型。 转载于:https://www.cnblogs.com/bhlsheji/p/4236368.html