多态是基于继承而言的,例如自定义父类Person,子类Son,那么可能会出现如下情况:

 Person *p =[ [Son alloc]init];

这种情况时,便是多态的使用。多态属于动态创建对象,分为两个步骤:1.确定当前对象的类型。2.动态绑定。

如果调用调用Son类中实现而其父类中并未实现的方法,便会出现问题。

因此为了避免出现由于使用多态而导致的问题,可以通过几种方法认为的规避错误,具体方法如下:

1.使用isMemberOfClass:方法判断当前对象是否是指定类的对象。注意:Foundition框架中的NSArray,NSString等不能使用isMemberOfClass方法。

2.使用isKindOfClass:方法判断当前对象指定类的对象或者其子类对象。

3.使用respondsToSelector:判断对象是否能相应指定方法。

4.使用instancesRespondToSelector:方法判断配个类是否实现了指定方法:注意只在.h文件中声明了方法,没有实现,则instancesRespondToSelector:返回NO。

5.使用performSelector:隐士调用方法,即只在.m文件中实现了方法,并未在.h中声明。

自定义Person类,.h类具体代码如下:

 @interface Person : NSObject

 @property (nonatomic, copy)NSString *name;

 @property (nonatomic, assign)NSInteger age;

 - (void)smaller;
@end

.m类如下:

 @implementation Person

 - (void)smaller {
_age --;
NSLog(@"年龄减少一岁"); }
- (void)growUp {
_age ++; NSLog(@"年龄增长一岁");
}
@end

主方法调用如下:

 int main(int argc, const char * argv[]) {
@autoreleasepool {
//1.判断对象是什么类型
id p = [[Person alloc]init]; //判断p是否是Person的对象
if([p isMemberOfClass:NSClassFromString(@"Person")]) {
NSLog(@"Person 对象 ");
}else {
NSLog(@"Person not ");
} //2.判断p是否是Person的对象或者其子类对象
if([p isKindOfClass:NSClassFromString(@"Person")]) {
NSLog(@"Person 对象 或者其子类对象");
} else {
NSLog(@"不是Person 对象 或者其子类对象");
}
//3.NSArray,NSString等不能使用isMemberOfClass方法 //4.判断对象是否能相应指定方法
if ([p respondsToSelector:@selector(length)]) {
NSLog(@"Person 对象能响应length方法");
}else {
NSLog(@"Person 对象不能响应length方法");
} //5.判断配个类是否实现了指定方法:注意只在.h文件中声明了方法,没有实现,则instancesRespondToSelector:返回NO
if ([Person instancesRespondToSelector:@selector(smaller)]) {
NSLog(@"Person 实现了smaller方法");
}else {
NSLog(@"Person 没有实现smaller方法");
} //6.隐士调用方法,即只在.m文件中实现了方法,并未在.h中声明
[p performSelector:@selector(growUp)];
}
return ;
}

iOS基础知识之多态问题的更多相关文章

  1. iOS面试必备-iOS基础知识

    近期为准备找工作面试,在网络上搜集了这些题,以备面试之用. 插一条广告:本人求职,2016级应届毕业生,有开发经验.可独立开发,低薪求职.QQ:895193543 1.简述OC中内存管理机制. 答:内 ...

  2. iOS - 基础知识总结(OC版) 面试必看 再不看就要用swift了

    OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装.继承.多态.它既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定.动态加载等).总体来讲,OC确实是一门不错 ...

  3. ios基础知识

    1获取系统语言设置 NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; NSArray *languages = ...

  4. iOS 基础知识

    1获取系统语言设置 NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults]; NSArray *languages = ...

  5. JAVA核心技术I---JAVA基础知识(多态)

    一:类转型 类转型:子类可以转父类,父类不可以转子类(除非父类对象本身就是子类) 1.父类 public class Human { public void say() { System.out.pr ...

  6. Java基础知识总结--多态

    面向对象编程的三大特性:封装.继承.多态 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据,而外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承是 ...

  7. iOS基础知识之类别

    本类从三个方面介绍iOS中的类别,分别是  什么是类别:类别的语法:类别的作用.具体内容如下: 一.类别: 类的补丁:当不能获取现有类的源码,但需要对现有类的功能进行补充时,这种情况下使用类别. 类别 ...

  8. iOS基础知识之属性及属性关键字

    iOS属性及属性关键字 一.属性功能:1.给现有的成员变量生成一对setter/getter方法.2.如果没有声明成员变量,自动声明一个_属性名的私有变量(默认的成员变量是受保护的). 二.属性关键字 ...

  9. JavaSE基础知识之多态

    一. 概述 多态是继封装.继承之后,面向对象的第三大特性,指同一行为,具有多个不同表现形式.生活中,比如跑的动作,小猫.小狗和大象,跑起来是不一样的.再比如飞的动作,昆虫.鸟类和飞机,飞起来也是不一样 ...

随机推荐

  1. Thinkphp自定义标签

    1.定义TagLib目录和文件  TagLibSmarTop.class.php 2.配置文件 <?php return array( 'APP_AUTOLOAD_PATH'=>'@.Ta ...

  2. Python入门 [输出,注释,列表,元祖,集合,字典,if,while,for]

    print("Hello Python") #输出 ''' 多行注释 用 三个引号 ''' a=1 #赋值 变量首字母只能书字母下划线 第二个字符数字,字母,下划线 声明一个列表 ...

  3. uoj#29. 【IOI2014】Holiday

    http://uoj.ac/problem/29 经过的点集一定是一个包含start的区间,为了经过这个区间内所有点,必须先到达一个区间端点,再到达另一个区间端点,剩余的步数则贪心选区间内最大价值的点 ...

  4. 《Java并发编程实战》笔记-synchronized和ReentrantLock

    在一些内置锁无法满足需求的情况下,ReentrantLock可以作为一种高级工具.当震要一些高级功能时才应该使用ReentrantLock,这些功能包括:可定时的.可轮询的与可中断的锁获取操作,公平队 ...

  5. Java-Runoob-高级教程-实例-数组:14. Java 实例 – 在数组中查找指定元素

    ylbtech-Java-Runoob-高级教程-实例-数组:14. Java 实例 – 在数组中查找指定元素 1.返回顶部 1. Java 实例 - 在数组中查找指定元素  Java 实例 以下实例 ...

  6. [C#][WebAPI]返回 json

    //将webapi的返回值设为Json格式 var jsonFormatter = new JsonMediaTypeFormatter(); GlobalConfiguration.Configur ...

  7. [UE4]Get Parent,widget获得父容器实例对象

  8. nginx file not found 错误处理小记

    安装完php php-fpm nginx 后访问php出现file not found错误,html就没问题配置文件server 段如下 server { listen 80; server_name ...

  9. Access、SQLServer、Oracle常见SQL语句应用区别

    Access.SQLServer.Oracle常见SQL语句应用区别 关劲松 PMP 如果要兼容Access.SQL Server.Oracle三个数据库版本:我们在编写SQL语句的过程中,尽量使用一 ...

  10. Git配置SSH Key

    最近看到很多人在配置Git时,遇到很问题,网上教程千篇一律.这儿自己单独记录一份. Git配置SSH Key 1.检查本机是否有ssh key设置,切换到.ssh目录 $ cd ~/.ssh 或cd ...