面向对象编程,即OOP,是一种编程范式,知足面向对象编程的语言,通常会提供类、 封装、继承等语法和概念来辅助咱们进行面向对象编程。程序员
面向对象是基于万物皆对象这个哲学观点. 所谓的面向对象就是将咱们的程序模块化, 对象化,把具体事物的特性属性和经过这些属性来实现一些动做的具体方法放到一个类 里面编程
面向对象的三大特征 继承,封装,多态 安全
继承模块化
继承:子类拥有父类的全部属性,和方法。函数
继承的好处:抽取出了重复的代码,减小代码冗余spa
继承的缺点:耦合性太强指针
继承的使用注意orm
(1)OC中不容许子类和父类拥有相同名称的成员变量名;htm
(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的出现,这个特性相信会被愈来愈多地使用。