大龙的博客

常用链接

统计

最新评论

object-c中的动态判定与选择器

使用id 这个泛型对象,假如别人传递给你一个id,你如何动态判断这个在
运行时传递过来的对象到底有没有XXX()方法呢?因为id 可以代表任意对象,你也不知道运
行时传递的这个id 里面到底有什么东西。其实NSObject中有一系列这样的方法用于动态判
定,类似于JAVA的反射机制,但是Objective-C的用起来更为简单。 
 

01 -(BOOL) isMemberOfClass: (Class) clazz 
02 //用于判断对象是否是clazz类型的实例,但不包含子类的实例。
03  
04 -(BOOL) isKindOfClass: (Class) clazz 
05 //用于判断对象是否是clazz 类型的实例或者clazz的子类的实例。
06  
07 -(BOOL)  respondsToSelector:  (SEL) selector
08 //用于判断类型或者对象是否能够回应某个方法,这个方法使用选择器表示。
09   
10 +(BOOL)  instancesRespondToSelector: (SEL) selector
11 //用于判断类型所产生的实例是否能够回应某个方法,这个方法使用选择器表示。
12  
13 - (id) performSelector: (SEL) selector 
14 //用于动态调用类型或者对象上的一个方法。

 
上面的后三个方法中都涉及到了一个新类型选择器SEL,它用于表示Objective-C的一个方法,
我们知道在C语言中有函数指针指向一个函数,也就是Objective-C的选择器就相当于C语
言中的函数指针,只不过选择器只能表示Objective-C类型中定义的方法。选择器使用
@selector(方法名)的形式获取,例如:@selector(initWithWidth:andHeight:) 、
@selector(alloc)。同时,SEL是在继Class、id 之后第三个不需要在变量前使用*的类型,
因为它已经是一个指针。 
另外,注意上面的红色文字,你可以看到这两行的方法都是-开头的,也就是成员方法,但
是为什么类也可以去掉用呢?其实是类的Class对象去掉用的,因为Class对象有着两个方法
的回应能力。 
 
我们以矩形、正方形的程序为基础,进行代码演示。 

01 int main(int argc,const char *argv[]){
02     MyRectangle *rec=[[MyRectangle alloc] initWithWidth: 2 andHeight: 5];
03     [rec area];
04     MySquare *squa=[[MySquare alloc] initWithSize: 6];
05     [squa area];
06       
07     //-(BOOL) isMemberOfClass: (Class) clazz 用于判断对象是否是clazz的实例,但不包含子类的实例。
08     if([squa isMemberOfClass: [MyRectangle class]]){
09         printf("squa isMemberOfClass MyRectangle\n");
10     }else{
11         printf("squa not isMemberOfClass MyRectangle\n");
12     }
13       
14     if([squa isMemberOfClass: [MySquare class]]){
15         printf("squa isMemberOfClass MySquare\n");
16     }else{
17       printf("squa not isMemberOfClass MySquare\n");
18     }
19     printf("----------------------------------------------\n");
20       
21     //-(BOOL) isKindOfClass: (Class) clazz 用于判断对象是否是clazz的实例或者参数的子类的实例。
22     if([squa isKindOfClass: [MyRectangle class]]){
23         printf("squa isKindOfClass MyRectangle\n");
24     }else{
25         printf("squa not isKindOfClass MyRectangle\n");
26     }
27       
28     if([squa isKindOfClass: [MySquare class]]){
29         printf("squa isKindOfClass MySquare\n");
30     }else{
31         printf("squa not isKindOfClass MySquare\n");
32     }
33     printf("----------------------------------------------\n");
34       
35       
36     //-(BOOL) respondsToSelector: (SEL) selector 用于判断对象或者类型是否有能力回应指定的方法。
37     if([squa respondsToSelector: @selector(initWithSize:)]){
38         printf("squa respondsToSelector initWithSize:\n");
39     }else{
40         printf("squa not respondsToSelector initWithSize:\n");
41     }
42   
43     if([MySquare respondsToSelector: @selector(alloc)]){
44         printf("MySquare respondsToSelector alloc\n");
45     }else{
46         printf("MySquare not respondsToSelector alloc\n");
47     }
48       
49     if([rec respondsToSelector: @selector(initWithWidth:andHeight:)]){
50         printf("rec respondsToSelector initWithWidth:andHeight:\n");
51     }else{
52         printf("rec not respondsToSelector initWithWidth:andHeight:\n");
53     }
54     printf("----------------------------------------------\n");
55       
56     //+(BOOL) instancesRespondToSelector: (SEL) selector 用于判断类产生的实例是否是由有能力回应指定的方法。
57     if([MySquare instancesRespondToSelector: @selector(initWithSize:)]){
58         printf("MySquare instancesRespondToSelector initWithSize:\n");
59     }else{
60         printf("MySquare not instancesRespondToSelector initWithSize:\n");
61     }
62       
63     if([MySquare instancesRespondToSelector: @selector(alloc)]){
64         printf("MySquare instancesRespondToSelector alloc\n");
65     }else{
66         printf("MySquare not instancesRespondToSelector alloc\n");
67     }
68     printf("----------------------------------------------\n");
69       
70 //-(id) performSelector: (SEL) selector 用于动态调用类或者对象上的一个方法。
71     id x_id=[rec performSelector: @selector(area)];
72     [MyRectangle performSelector: @selector(alloc)];
73       
74     [rec release];
75     [squa release];
76 }
@import url(http://www.cppblog.com/cutesoft_client/cuteeditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

posted on 2013-02-27 11:30 大龙 阅读(1128) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理