1.动态性:
OC的动态性具体是指利用id类型(动态类型)的指针指向任意一个对象,此时对象的类型在编译期不做类型检查,它可以是任何类型,而在运行时确定它的类型,它运行时的类型一般来说为你赋给它的类型,在运行时类型确定好后,相关的方法也就绑定好了。比如:id temp=[[NSString alloc]init];此时temp对象的类型是任意的,你可以编写[temp mehthod],不管这个temp的具体类型到底能不能接受这个method,因为在编译期都不会做检查,所以编译就会通过,你可以将method设置为属于UILabel的settext:方法---这个NSString没有的方法。但是当代码具体运行到这里的时候,会报错,显示为不能识别的method,即temp无法响应这个方法,因为运行时这个temp对象是一个NSString对象,非UILabel对象,所以无法响应settext:方法,如果将method改成一个NSString有的方法,就没什么问题了。
另外,如果编写这样的代码:
NSString *str=[[UIButton alloc]init];
在编译的时期,会给出类型不匹配的警告,此时调用[str length]方法会引发警告:“str可能无法响应length方法”,即UIButton对象可能无法响应length方法,运行一下,出现报错--str无法响应length这个属于NSString的方法。在编译的时候,编译器会吧str认为是一个NSString对象,在后面编写给str发送属于NSString的方法也会编译通过,但是到了运行时阶段,str对象实际是一个UIButton对象,它无法响应length方法,所以运行时会出现错误。
如果将length换成一个UIButton对象的方法,那么直接出现编译不通过,因为此时编译器将str认为是一个NSString对象,认为它无法响应这个不属于自己的方法。
注:编译期:是指在代码编写阶段,编译期对代码进行基本的检查报错--语法分析、词法分析等。
运行时:通过编译这一关后,将编译好的代码装载到内存中运行起来的阶段,这个时候会进行类型检查,不仅仅是对代码进行简单检查,此时出错会导致崩溃的产生。
2.多态性
多态性是面向对象语言的一般性,是指不同对象对同一方法对不同响应方式,通常是用父类的指针指向各种子类的对象,不同的子类对象对继承自父类的某一方法进行各自的重写,从而实现对同一方法对不同实现:
比如此时有一个A父类,它有BCD三个不同的子类,三个子类分别对父类中的speak方法(其他语言可能成为函数)进行了各自的覆写,A的的speak方法中可以设置NSLog(@"A"),而子类覆写speak方法各自输出自己类别,当给不同类别的对象发送speak消息的时候。B、C、D对象各自NSLog输出B、C、D。
但是OC中也可以利用id指针指向不同的对象,从而代替父类的存在而实现多态性,此时不同对象都能响应此方法,但各自实现细节不同;
3.重载
重载是指,支持定义函数名相同,但是函数参数个数不同、参数类型不同的不同函数,它只和类内部有关,是横向的,而继承是父子类间的,是纵向的。OC基本不支持重载,它仅仅支持参数个数不同的重载。比如方法-(int )get:(int)a and:(int)b;方法和-(int)get:(int)a;就是参数个数不同的重载,其实这个时候,两个方法的方法名已经不相同了,去除参数类型后一个为get:and:,一个为get:,OC之所以仅仅支持参数个数不同的重载,是因为OC调用具体方法的时候是用@selecter来取方法名,一个@selector()得到方法名是一个SEL类型的结构体数据类型,每个方法名得到的SEL数据具有唯一性,方法的SEL数据是被放在一个SET集合中的,印证了SEL结构数据的唯一性。
网友评论