OC中关于几个判断对象归属及消息可用性的方法
2016-03-31 21:25
363 查看
关于几个判断对象归属及消息可用性的方法
1、类的接口声明:
有自定义的两个类,分别是Square和Rectangle。其中类接口声明如下所示:
Rectangle 类接口:
@interface Rectangle : NSObject -(void)sideOfOb; @end
Rectangle继承自NSObject。
Square类接口:
@interface Square : Rectangle -(void) setWidth: (int) a andHeight: (int) b; -(void)sideOfOb; @end
Square类继承自Rectangle。
2、main函数中使用测试函数:
int main(int argc, const char * argv[]) { @autoreleasepool { Square* mySquare = [[Square alloc]init]; //------------------------------------------------------------------------ //直接关系 : isMemberOf //测试某个对象是否是某个类的实例对象:isMemberOf 可以准确识别某个对象的类型归属 if ( [mySquare isMemberOfClass:[Square class]] == YES ) {//调用类的class方法,生成一个类对象,用作isMemberOfClass对象方法的参数 //该对象方法返回一个布尔值 NSLog(@"mySquare is a member of Square class "); } if ( [mySquare isMemberOfClass:[Rectangle class]] == YES ) { NSLog(@"mySquare is a member of Rectangle class"); } if ([mySquare isMemberOfClass:[NSObject class]] == YES) { NSLog(@"mySquear is a member of NSObject class"); } //------------------------------------------------------------------------ //归属关系 : isKindOf //测试某个对象的类型:isKindOf 可以准确识别某个对象是某继承链上类的对象 if ([mySquare isKindOfClass:[Square class]] == YES) { NSLog(@"mySquare is a kind of Square"); } if ([mySquare isKindOfClass:[Rectangle class]]) { NSLog(@"mySquare is a kind of Rectangle"); } if ([mySquare isKindOfClass:[NSObject class]]) { NSLog(@"mySquare is a kind of NSObject"); } //------------------------------------------------------------------------ //在square类中定义setwidthandheight,在Rectangle中定义whensetsied //测试mySquare对象可以接受哪些消息: respondsToSelector 使用@selector指令来达到目的 //未在square中定义whenSetSide,即使它父类中有这个方法,但是这个测试也是为FALSE。 //继承的对象方法测试不会成功 if ([mySquare respondsToSelector:@selector(sideOfOb:)]) //提示未声明的selector { NSLog(@"mySquare responds to whenSetSide: method."); } //类中有这个方法,测试成功输出 if ([mySquare respondsToSelector:@selector(setWidth:andHeight:)]) { NSLog(@"mySquare responds to setSide:andHeight method."); } //测试类Square对selector:alloc的反应,成功 //可能是因为Square类中有自动生成的alloc的实现********************* if ([Square respondsToSelector:@selector(alloc)]) { NSLog(@"Square class responds to alloc method."); } //------------------------------------------------------------------------ //测试类对象支持的方法:instancesRespondsToSelector 类的实例可以接收哪些消息 //测试未成功。是因为没有声明这个selector导致的呢?和PIOC不一致 if ([Square instancesRespondToSelector:@selector(sideOfOb:)]) { NSLog(@"Instances of Square responds to setSide: method."); } if ([Rectangle instancesRespondToSelector:@selector(sideOfOb:)]) { NSLog(@"Instances of Rectangle responds to setSide: method. "); } //测试某个类是否是另外一个类的子类 if ([Square isSubclassOfClass:[Rectangle class]]) { NSLog(@"Square is a subclass of a rectangle."); } }//autoReleasePool... return 0; }//main function...
输出结果如下所示:
2016-03-31 13:30:59.405 ask_questions[8535:190806] mySquare is a member of Square class 2016-03-31 13:30:59.406 ask_questions[8535:190806] mySquare is a kind of Square 2016-03-31 13:30:59.406 ask_questions[8535:190806] mySquare is a kind of Rectangle 2016-03-31 13:30:59.407 ask_questions[8535:190806] mySquare is a kind of NSObject 2016-03-31 13:30:59.407 ask_questions[8535:190806] mySquare responds to setSide:andHeight method. 2016-03-31 13:30:59.407 ask_questions[8535:190806] Square class responds to alloc method. 2016-03-31 13:30:59.407 ask_questions[8535:190806] Square is a subclass of a rectangle. Program ended with exit code: 0
3、说明:
3.1 isMemberOf方法:
测试某个对象是否是某个类的实例对象:isMemberOf 可以准确识别某个对象的类型归属 。比如上面使用的是
if ( [mySquare isMemberOfClass:[Square class]] == YES ) {//调用类的class方法,生成一个类对象,用作isMemberOfClass对象方法的参数 //该对象方法返回一个布尔值 NSLog(@"mySquare is a member of Square class "); }
得到的输出为:
2016-03-31 13:30:59.405 ask_questions[8535:190806] mySquare is a member of Square class
但是之后跟上的几条语句都未得到输出,说明这个isMemberOf的功能就是:测试对象直接隶属于哪个类。
3.2 isKindOf方法:
代码如下:if ([mySquare isKindOfClass:[Square class]] == YES) { NSLog(@"mySquare is a kind of Square"); } if ([mySquare isKindOfClass:[Rectangle class]]) { NSLog(@"mySquare is a kind of Rectangle"); } if ([mySquare isKindOfClass:[NSObject class]]) { NSLog(@"mySquare is a kind of NSObject"); }
这三个判断均有输出:
2016-03-31 13:30:59.406 ask_questions[8535:190806] mySquare is a kind of Square 2016-03-31 13:30:59.406 ask_questions[8535:190806] mySquare is a kind of Rectangle 2016-03-31 13:30:59.407 ask_questions[8535:190806] mySquare is a kind of NSObject
说明isKindOf的功能是:测试某对象是哪族类型的,使用该对象所属类的继承链上的所有类进行测试的话,都会成功。
3.3 respondsToSelector方法
当使用这个方法时:if ([mySquare respondsToSelector:@selector(setWidth:andHeight:)]) { NSLog(@"mySquare responds to setSide:andHeight method."); } if ([Square respondsToSelector:@selector(alloc)]) { NSLog(@"Square class responds to alloc method."); }
对象的respondsToSelector方法主要是用于测试对象能否接受@selector指令所指示的消息。
得到的输出如下:
2016-03-31 13:30:59.407 ask_questions[8535:190806] mySquare responds to setSide:andHeight method. 2016-03-31 13:30:59.407 ask_questions[8535:190806] Square class responds to alloc method.
可以看到,因为在Square类中有这个setWidth:andHeight:,所以测试成功输出。而对Square类进行这个测试,类方法alloc也能成功,说明这个方法可以被对象接收,也能被类接收。
3.4 instancesRespondToSelector方法
if ([Square instancesRespondToSelector:@selector(sideOfOb:)]) { NSLog(@"Instances of Square responds to setSide: method."); } if ([Rectangle instancesRespondToSelector:@selector(sideOfOb:)]) { NSLog(@"Instances of Rectangle responds to setSide: method. "); }
上面代码没有产生输出,这个instancesRespondToSelector方法待查。
3.5 isSubClassOfClass方法
这个方法用于测试某个类是否是另一个类在继承链上的子类。代码如下:
if ([Square isSubclassOfClass:[Rectangle class]]) { NSLog(@"Square is a subclass of a rectangle."); }
输出如下:
2016-03-31 13:30:59.407 ask_questions[8535:190806] Square is a subclass of a rectangle.
成功输出,测试成功。
4、关于class方法:
class是一个类方法,当将它和类名合用时,如:[Rectangle class];
生成的是一个该类(因为类也是一种对象)。一般这个语句都是用在上面条件判断的情况,如:
if ([mySquare isKindOfClass:[Square class]] == YES)
上面的代码中使用[Square class],向Square类发送class消息,生成一个类(实例),作为isKindOfClass的参数。而刚才也说过,这个isKindOfClass是测试这个对象是否是给出的类(这里就是生成的那个类)继承链上类的对象。
5、关于@selector指令:
待查,后续补充。相关文章推荐
- Android Native 绘图方法
- Python动态类型的学习---引用的理解
- 土人系列AS入门教程 -- 对象篇
- PostgreSQL教程(三):表的继承和分区表详解
- C#托管堆对象实例包含内容分析
- C#中struct和class的区别详解
- C#实现获取不同对象中名称相同属性的方法
- Lua面向对象之类和继承浅析
- 浅析Ruby中继承和消息的相关知识
- javascript asp教程第十一课--Application 对象
- PowerShell中使用Out-String命令把对象转换成字符串输出的例子
- VBS ArrayList Class vbs中的数组类
- VBS教程:对象-正则表达式(RegExp)对象
- 大家看了就明白了css样式中类class与标识id选择符的区别小结
- 设计引导--一个鸭子游戏引发的设计理念(多态,继承,抽象,接口,策略者模式)
- C#检查指定对象是否存在于ArrayList集合中的方法
- sql2008启动代理未将对象应用到实例解决方案
- C#编程自学之类和对象
- C++中对象的常引用、动态建立和释放相关知识讲解
- C++实现不能被继承的类实例分析