Objective-C学习笔记Day0824

继承和类别的区别:

1. Extension 是匿名的Category。

2. Extension 定义的方法,须在类的implement 中实现,而category不强求。

3. Extension可以定义属性,而Category不能定义属性。

继承与分类最大的区别是,一般情况下,分类不能扩展属性,继承可以扩展属性。但有一种情况下,分类可以扩展属性,那就是在本类中写的分类。

这里解释下,属性与成员变量的关系。

属性: 声明一个属性,则系统会默认给生成读取函数(set,get),可以通过点运算符来默认调用这个存取方法,并且会产生一个以_开头的成员变量。

属性就是与属性相对应的成员变量的值。在使用属性的时候,其实本质也是对成员变量的值进行操作。

成员变量:则是单纯的一个变量,不会有连带的存取方法。

属性是暴露在外面的,可以供外面进行访问调用的。而成员变量默认是protected的,保护的成员,如果被设置为public才允许外部对象调用,否则,是访问不到的。

在Objective-C中,给一个类扩展一个其它方法,有两种实现方式:类别和继承。

1.继承Inherit

这个是面向对象语言都有的一个特性,子类会继承父类的方法和属性。

对于以下情况,无法使用类别,必须使用继承。

1)新扩展的方法与原方法同名,但是还需要使用父类的实现。因为使用类别,会覆盖原类的实现,无法访问到原来的方法。

2)扩展类的属性,这个类别无法做到。

2.类别category

这是Objective-C语言的一个特性,可以在不改变类名和原来类的实现的前提下,实现对类的方法扩展。

以下两种方式最后使用类别。

1)针对系统提供的一些类,例如:NSString,NSArray,NSNumber等类,系统本身不提倡使用继承去扩展方法,因为这些类内部实现对继承有所限制,所以最后使用类别来进行方法扩展。

2)类别支持开发人员针对自己构建的类,把相关的方法分组到多个单独的文件中,对于大型而复杂的类,这有助于提高可维护性,并简化单个源文件的管理。

派生,重写,多态:

重写:子类重写父类的方法

父类 superclass (超类)

子类  subclass

@private        //私有成员,不能被外部函数访问(使用),也不能被子类继承

@protected  //保护成员,不能被外部函数访问,可以被子类继承

@public      //公有成员,可以被外部函数访问,可以被子类继承

同一个接口,不同的实现,成为多态。重写是多态的一种。

从已有的类(父类)产生一个新的子类,称为类的派生。派生类是基类的具体化,而基类则是派生类的抽象。

重载定义:派生类继承父类方法时,该方法具有相同的返回类型,并且参数的数目与重载的方法相同,即对父类同名函数进行重写。

好处:可以利用重载来修改继承方法的定义。

类别和扩展的区别:

类别是一种可以为现有的类添加新方法的方式。(类别不能添加实例变量)。

类别可以为现有的类添加新的方法;将类的实现分散到多个不同的文件或者多个不同的框架中;创建对私有方法的前向应用;使用类别的非正式协议来实现委托;通过替换现有的类中的方法,修正现有类的功能或者错误。

类别的局限性:

无法向现有的类中添加新的实例变量;方法名称冲突,即类别中的新方法和现有类中的方式重名时,类别具有更高的优先级,类别中的方式将完全替换现有类的方法。

类扩展;

类扩展不需要名字;可以在包含源代码的类中使用;可以添加实例变量;可以将只读权限改为读写权限;创建数量不限

单例:

单例,简单的语言概括,就是唯一的一个实例,也就是唯一的一个对象,大家都对同一个对象进行操作。即Singleton模式。在程序中,我需要一系列的对象,他们每一个内部都包含有一组变量和功能,是静态的,而且整个程序都只需要拥有一个该类的对象。例如:控制程序执行的命令器;管理数据库;音效控制;文件处理等。

在Foundation框架中,很多的类中都用到了单例这种编程模式,它是处理数据共享的最常用的一种方法。简单的理解,就是在开发过程中,有时会需要在不同的地方对同一块内存的数据进行操作,而对于OC来讲,这块内存往往代表的是一个对象的数据。可以通过一个类方法直接返回一个本类的对象(必须是类方法,因为如果是对象方法,在调用的时候还要声明一个该类的对象并对其初始化,而这个对象本身没有实际作用,无故的占用了内存空间),而且保证这个对象只被分配一次内存空间(这样才能保证通过这个对象永远能够对那块内存空间进行操作),通过这种方式,在整个工程中,你只要想读取这块内存中的数据,就可以通过调用该类的类方法返回这个唯一的对象。

常用设计模式:

代理模式:

应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现。

优势:解耦合敏捷原则:开放-封闭原则实例:tableview的 数据源delegate,通过和protocol的配合,完成委托诉求。列表row个数delegate自定义的delegate

观察者模式

应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息。

优势:解耦合敏捷原则:接口隔离原则,开放-封闭原则实例:Notification通知中心,注册通知中心,任何位置可以发送消息,注册观察者的对象可以接收。kvo,键值对改变通知的观察者,平时基本没用过。

MVC模式:

应用场景:是一中非常古老的设计模式,通过数据模型,控制器逻辑,视图展示将应用程序进行逻辑划分。

优势:使系统,层次清晰,职责分明,易于维护敏捷原则:对扩展开放-对修改封闭实例:model-即数据模型,view-视图展示,controller进行UI展现和数据交互的逻辑控制。

单例模式:

应用场景:确保程序运行期某个类,只有一份实例,用于进行资源共享控制。

优势:使用简单,延时求值,易于跨模块敏捷原则:单一职责原则实例:[UIApplication sharedApplication]。

注意事项:确保使用者只能通过 getInstance方法才能获得,单例类的唯一实例。java,C++中使其没有公有构造函数,私有化并覆盖其构造函数。object c中,重写allocWithZone方法,保证即使用户用 alloc方法直接创建单例类的实例,返回的也只是此单例类的唯一静态变量。

策略模式:

应用场景:定义算法族,封装起来,使他们之间可以相互替换。

优势:使算法的变化独立于使用算法的用户敏捷原则:接口隔离原则;多用组合,少用继承;针对接口编程,而非实现。

实例:排序算法,NSArray的sortedArrayUsingSelector;经典的鸭子会叫,会飞案例。

注意事项:

1,剥离类中易于变化的行为,通过组合的方式嵌入抽象基类

2,变化的行为抽象基类为,所有可变变化的父类3,用户类的最终实例,通过注入行为实例的方式,设定易变行为防止了继承行为方式,导致无关行为污染子类。完成了策略封装和可替换性。

工厂模式:

应用场景:工厂方式创建类的实例,多与proxy模式配合,创建可替换代理类。

优势:易于替换,面向抽象编程,application只与抽象工厂和易变类的共性抽象类发生调用关系。

敏捷原则:DIP依赖倒置原则实例:项目部署环境中依赖多个不同类型的数据库时,需要使用工厂配合proxy完成易用性替换注意事项:项目初期,软件结构和需求都没有稳定下来时,不建议使用此模式,因为其劣势也很明显,增 加了代码的复杂度,增加了调用层次,增加了内存负担。所以要注意防止模式的滥用。

你可能感兴趣的:(Objective-C学习笔记Day0824)