面向对象编程,即OOP,是一种编程范式,满足面向对象编程的语言,一般会提供类、 封装、继承等语法和概念来辅助我们进行面向对象编程。
面向对象是基于万物皆对象这个哲学观点. 所谓的面向对象就是将我们的程序模块化, 对象化,把具体事物的特性属性和通过这些属性来实现一些动作的具体方法放到一个类 里面
面向对象的三大特征 继承,封装,多态
继承
继承:子类拥有父类的所有属性,和方法。
继承的好处:抽取出了重复的代码,减少代码冗余
继承的缺点:耦合性太强
继承的使用注意
(1)OC中不允许子类和父类拥有相同名称的成员变量名;
(2)OC中的子类可以拥有和父类相同名称的方法,在子类调用时,优先去自己的内部寻找,如果没有则一层一层的往上找;
在子类中重写父类的方法,会覆盖父类的方法。
super关键字:
super关键字,在子类中重写方法时,可以让调用者跳过这一层而调用父类中的方法。
使用场景:子类在重写父类方法时,想要保留父类的一些行为。
封装
概念:封装也称为信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封 装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内 部,尽可能地隐藏内部的细节,只 保留一些对外接口使之与外部发生联系。系统 的其他部分只有通过包裹在数据外面的被授权的操作来与这个抽象数据类型交流 与交互。也就是说,用户无需知道对象内部方法的实现细节,但可以根据对象提 供的外部接口(对象名和参数)访问该对象。
好处:(1)实现了专业的分工。将能实现某一特定功能的代码封装成一个独立的实 体后,各程序员可以在需要的时候调用,从而实现了专业的分工。(2)隐藏信 息,实现细节。通过控制访问权限可以将可以将不想让客户端程序员看到的信息 隐藏起来,如某客户的银行的密码需要保密,只能对该客户开发权限。
多态:
没有继承,就没有多态
不同类的对象能够定义相同名称的方法
当父类对象的指针或引用指向子类对象时,会进行动态监测,调用真实的方法
C++只有虚函数才能实现多态,OC中所有方法都可以
理解:子类以父类的身份出现,但做事情时还是以自己的方法实现。子类以父类 的身份出现需要向上转型(upcast),其中向上转型是由JVM自动实现的, 是安全 的,但向下转型(downcast)是不安全的,需要强制转换。子类以父类的身份出现 时自己特有的属性和方法将不能使用。
而OC是典型的面向对象的语言
OC也是一门动态语言,那么他的动态性是如何体现的呢?
先了解一下什么是动态语言
动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化
比如众所周知的ECMAScript(JavaScript)便是一个动态语言。除此之外如Ruby、Python等也都属于动态语言,而C、C++等语言则不属于动态语言。
OC的动态特性表现为了三个方面:动态类型、动态绑定、动态加载。之所以叫做动态,是因为必须到运行时(run time)才会做一些事情。
动态类型:程序直到执行时才能确定所属的类。动态类型,说简单点就是id类型
id数据类型
id 通用的对象类型,可以存储任意类型的对象,id后面没有*号,它本身就是个指针
类似于void * ,但只可以指向对象类型
动态绑定:程序直到执行时才能确定实际要调用的方法。
动态绑定所做的,即是在实例所属类确定后,将某些属性和相应的方法绑定到实例上。
Class类:表示一个类名,class被创建后,我们可以把class来当成对象的类。
Class cla1 = [类名 class]
Class cla2 = [对象 class]
Class cla3 = NSClassFromString(@"类名");
SEL 类成员方法的指针
可以理解 @selector()就是取类方法的编号,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接应用函数指针,这样只能做一个@selector语法来取.
它的结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)
1>类里面的方法都是被转换成SEL变量进行存储的。
2>放类声明一个对象,对象调用方法的时候,系统会被这个方法转换成SEL,然后拿这个SEL到类方法中去匹配。
3>我们可以自己手动把方法转换成SEL,然后用这个SEL去查找方法(performSelector)。
-isMemberOfClass:
判断是否是这个类的实例
-isKindOfClass:
判断是否是这个类或者这个类的子类的实例
-respondsToSelector:
判读实例是否有这样方法
+instancesRespondToSelector:
判断类是否有这个方法。此方法是类方法。
动态加载
根据需求加载所需要的资源,这点很容易理解,对于iOS开发来说,基本就是根据不同的机型做适配。最经典的例子就是在Retina设备上加载@2x 的图片,而在老一些的普通屏设备上加载原图。随着Retina iPad的推出,和之后可能的Retina Mac的出现,这个特性相信会被越来越多地使用。