Objective-C的反射

原创 2012年03月22日 16:24:26

我第一次接触Java的时候就觉得整个反射包都很新颖,它使得Java和解释型的脚本语言更接近了,与此同时也拉开了和主流的C和C++的距离。在运行时可以窥视到一个对象的类元数据真的很不可思议,尽管这些可能不会在日常应用编程中经常使用到。从Java转到Objective-C的程序员应该会乐见Objective-C也支持反射。实际上,Objective-C有很多诸如动态改变类定义以及创建一个新类的动态特征。不过很难说这些功能有多大的作用,这也让我觉得Objective-C是一个有些臃肿的语言。在我看来,Objective-C有一个定位危机:它是解释型语言还是编译语言?运行时很大程度上是动态的。和C++不同,Objective-C是运行时绑定的。这也是为什么我们可以在实现时定义一个从来没有在头文件中声明的方法,或者通过Category扩展类。不幸的是由于这种臃肿使得找到一些日常编程中有用的东西变得困难,本文就是要去发现其中的一些“宝藏”。

根类NSObject

   大部分(如果不是全部的话)的动态反射支持来自NSObject类。和Java的Object对象类似,NSObject是所有类(除了一些很少见的例外)的根类。所以所有你写的类应该都可以支持反射。需要指出的所有这些的反射支持并不是Objective-C语言的一部分,而是源于NS*的运行时环境。这也是为什么这些东西感觉被加入一些额外东东的原因。因为它就是被加入了额外东东。

 

获取类的元数据   通过调用如下的类方法你就可以获取到一个对象的类的元数据:

  1. Class c [self class];  

   该方法既是实例方法也是类方法。它返回一个带有很多神奇信息的C构造体,比如实例变量、方法等等。所有这些和java.lang.reflect包相比都有些过时了,利用Objective-C访问这些信息的接口看起来很复杂。这可能就是故意设计成这样来“过滤”一些不合格的程序员。目前为止我唯一使用这些的地方就是为下面将要介绍的isKindOfClass:方法提供参数。一直以来我都不需要去窥视类结构的内容。

 

动态方程调用   我已经在方法调用一文中介绍了反射的一个方面。这使得你可以在运行时创建一个方法调用并传入参数。这和Java中使用java.lang.reflect.Method类很相似。

检查继承关系

   Java有一个名为instanceof的操作符可以用来检查一个对象是否是一个特定类或者接口的实例。Objective-C也有类似的功能,就是通过isKindOfClass:方法。isKindOfClass:会在消息接收者是指定类及其子类的实例的情况下返回YES。比如有一个关联的指针数组,这样就可以根据其类型进行不同的操作:


	for(BaseClass* base in myArray) {  
	if([base isKindOfClass:[ClassOne class]]) {  
	     // do stuff specific to ClassOne  
	}   
	else if([base isKindOfClass:[ClassTwo class]]) {  
	     // do stuff specific to ClassTwo  
	}  
	else if([base isKindOfClass:[ClassThree class]]) {  
	     // do stuff specific to ClassThree  
	}    
	}  

   如果你需要一个精确的类匹配,而不是匹配任何继承类,你就可以使用isMemberOfClass:方法。

 

检查是否符合协议   和实例检查类似,你可以测试一个对象是否符合特定的协议。Java在类和接口的情况下都使用instanceof方法搞定,但Objective-C使用了一个更笨重的方法。在测试是否合规的时候,应该使用conformsToProtocol:方法:

  1. BOOL conforms [obj conformsToProtocol:@protocol(MyInterface)];  

检查方法是否存在   对于像我这样Java和C++的老手来说,如果不知道一个对象是否实现了一个方法就很奇怪了。但是Objective-C的类很大程度上是动态的,你就需要检查你需要的方法是否存在。这就需要respondsToSelector:方法。如下代码就是检查接收者是否实现(或者继承)了指定方法:

  1. if([obj respondsToSelector:@selector(aMethod:)]) // it's there, so we can call it [obj aMethod:YES];  

   当然,利用Objective-C的反射你可以做更多的事情,这里我只是尝试谈谈反射机制最常见的应用。如果你需要在你的软件中加入核心的动态特性,你就需要熟悉下这些文档:Runtime Programming Guide:Introduction Runtime Reference


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Objective-C 中的反射机制

刚刚发现,OC 中也有类似 Java 中的反射机制:   如下代码:   UIView *view =[[APLabel alloc] initWithNode:node];   可以改写...

Object-C中的“反射”

无论是学过java或者c#都会接触到反射这个概念,反射是一个非常强大的机制,在OC中其实也有类似这么个概念,可理解为OC中的“反射”,reflect。 关键字: - isKindOfCl...

Objective-C反射机制

Objective-C反射机制

从JSONModel看Objective-C的反射机制

移动互联时代,JSON作为一种数据传输格式几乎随处可见。作为iOS开发者,收到一串JSON字符串要怎么处理?我想多数情况下是需要将它转成自定义的NSObject对象再使用,对于这个转换的过程,大部分人...

解析Objective-C反射

Objective-C反射是本文要介绍的内容,我第一次接触Java的时候就觉得整个反射包都很新颖,它使得Java和解释型的脚本语言更接近了,与此同时也拉开了和主流的C和C++的距离。 在运行时可...

iOS 开发--Objective-C 反射机制

了解反射机制 Objective-C语言中的OC对象,都继承自NSObject类。这个类为我们提供了一些基础的方法和协议,我们可以直接调用从这个类继承过来方法。当然,本篇文章中讲到的反射方法,就...

【IOS 开发学习总结-OC-23】★objective-c的反射机制

【IOS 开发学习总结-OC-23】★objective-c的反射机制objective-c 提供的与运行环境交互的方式objective-c 提供了3种编程方式与运行环境交互。 直接通过 oc 源代...

利用Objective-C的反射机制和运行时特性实现类静态方法的动态访问(一)

利用Objective-C的反射机制和运行时特性实现类静态方法的动态访问,解决不能使用NSObject类的反射方法 performSelector 访问静态方法的坑爹问题!

iOS 开发--Objective-C 反射机制

了解反射机制 Objective-C语言中的OC对象,都继承自NSObject类。这个类为我们提供了一些基础的方法和协议,我们可以直接调用从这个类继承过来方法。当然,本篇文章中讲到的反射方法,就...

Objective-C的反射

转自:http://blog.sina.com.cn/s/blog_6d723b1f0100q6m6.html     我第一次接触Java的时候就觉得整个反射包都很新颖,它使得Java和解...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)