总结:继承、分类(Category、extension)、协议(protocol)

 
一、继承:
(1)特点: 继承多用于一般父类中的方法功能比较齐全,子类从父类继承过来使用,可以省略很多重复的代码,不仅简化了代码,而且也提高了代码的复用性。
 
(2)过程: 当子类需要的方法和属性在父类中找不到时,子类可以添加自己必要的方法和属性,目的是对功能进行扩充;当父类中有子类需要的方法,但是方法中内容并不能完成子类的需要时,子类可以重新实现这个同名的函数,它会覆盖父类的同名函数来实现子类的需要的内容。
 
(3)格式: @interface 类名 : 父类名    =====> .h声明文件 
  { 
属性property;
  }
 //@property(参数1,参数2) 类型名 变量名;
  方法method;
 @end
                 
  @implementation 类名      ======>.m实现文件
  //@synthesize 变量名
  {
     实现方法method;
  }
  @end
(4)说明:
                @property(参数1,参数2) 、@synthesize 变量名

读写属性: (readwrite/readonly)

setter语意:(assign/retain/copy)

原子性: (atomicity/nonatomic)

各参数意义如下:

readwrite: 产生setter\getter方法

readonly: 只产生简单的getter,没有setter。

assign: 默认类型,setter方法直接赋值,而不进行retain操作

retain: setter方法对参数进行release旧值,再retain新值。

copy: setter方法进行Copy操作,与retain一样

nonatomic: 禁止多线程,变量保护,提高性能

二、分类:有两种形式

第一种:类别(命名的分类) Category  它有.h和.m文件 (只能新添加方法)

第二种:类扩展(延展)(未命名的分类) extension 它只有.h文件 (可以添加方法和实例变量)

(1)特点:分类多用于没有源代码的类,分类可以提供类需要的所有方法,它扩展类的功能,一般分模块进行。当然,它在不修改原有类的基础上添加新的方法,正是因为它具有将一个庞大的类可以分模块实现的优点,才使得做项目时更有利于团队的合作。它在扩展现有类的方法时,不需要访问源码,也不需要创建子类,而且也不必实现分类中的所有方法,这是它与一般接口和协议的区别之处。当分类中的方法与类方法同名时,它会覆盖类中的方法,那么类的同名方法永远就执行不到。

(2) 过程:<1>类别Category的使用时,它有.h声明文件和.m实现文件,所有新添加的方法都放在.h文件中进行声明,然后再.m文件中根据自己的需要选择性的实现这些方法。切记,它只能新添加方法,而且都是公有的;<2>类扩展extension使用时,它只有.h声明文件,所有新添加的方法和实例变量都只能在类中分别进行实现和初始化。切记,它新添加的方法和实例变量都是类私有的,只能在本类中进行访问,访问方式为[self method],不然即使在其他的任何地方有这个类的对象也不能访问到。一般地,类扩展不单独作为一个文件,而是直接把它写入类的实现文件中实现即可。

(3)格式:头文件名       类名+分类名.h     例如:NSString+Math.h

<1>Category

@interface 类名(分类名)        =========> .h声明文件

{

新添加的方法method;

}

@end

@implementation 类名        ==========>.m实现文件

{

实现新添加的方法method;

}

@end

<2> extension

@interface  类名()                 ============> .h声明文件

{

先添加的实例变量property;

}

//@property(参数1,参数2) 类型名 变量名;

新添加的方法method;

@end

(4)提醒:在类别中只能添加方法,方法都是公有的;在类扩展中,既可以添加方法,也可以添加实例变量,但是添加的内容都是类私有的,只能在类的内部访问。

三、协议(protocol)

(1)特点:协议多用在许多类同时使用相同的方法而且这些代码重复性很大的情况下,它会把这些重复的代码提炼出来放在一个协议里,供大家使用。它确实有些类似于java中的接口和C++中的纯虚函数的抽象类,它提供协议的规则,使用者只有遵从协议的规则才能使用它所提供的方法。当然这些方法在协议中它只是帮助进行了声明,并没有任何的实现。当使用者遵从这个协议并使用它的方法时,如果在类声明文件中方法都是默认的或者是@required时,那么在类实现文件中必须全部地实现这些方法。如果是@optional标记的,使用者可以选择性的实现,视情况而定。

(2)过程:它只有.h声明文件,它既可以作为一个单独的文件进行声明所提供的方法,也可以直接放在类声明文件中进行声明,一般采用后者进行声明。它的方法声明时有默认、@required、@optional三种情况。当使用前面两种时,在类实现文件中必须全部地实现这些方法。如果是@optional标记的,使用者可以选择性的实现,视情况而定。当它的方法没有@optional时,那么它就类似于接口中的abstract整个类是抽象的,是必须全部实现所有的方法的。

(3)格式: @protocol  协议名:<父类协议名>   =======>放在类的.h文件中或者在自己的单独创建的.h文件中

{

method1;//默认的,类实现文件中必须要实现这个方法

@required

method2; //需求的,类实现文件中必须要实现这个方法

@optional

method3;//可选择的,使用者可以选择性的实现

}

@end

(4)应用:利用协议可以实现代理模式。也就是给类寻找委托人,帮助类完成一些功能,而类不用自己亲自去做。这种代理模式使得代码的灵活性提高,也降低了耦合性,不必向继承那样,因为父类和子类的耦合性太强,父类一变化,子类就也得跟着变化,太过麻烦。协议要求,不管使用者是谁,阿猫阿狗都行,只要遵从规则,就可以用协议的方法替类去完成委托的任务。类似于老板与秘书的关系:老板出差时,秘书给老板订票、订房;老板开会时,秘书就负责通知所有要开会的人。。。

(5)说明:协议也是可以继承的,就如所有类的根类是NSObject一样,协议的根类协议也是NSprotocol;满足协议规则的类,在类的后面跟上<协议名字>,例如:@interface Student:Person<协议名>

Objective-C:继承、分类(Category、extension)、协议(protocol),个人理解,仅供参考的更多相关文章

  1. 从C#到Objective-C,循序渐进学习苹果开发(3)--分类(category)和协议Protocal的理解

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本文继续上一篇随笔<从 ...

  2. OC基础--分类(category) 和 协议(protocol)

    OC 中的category分类文件相当于 C#中的部分类:OC 中的protocol协议文件(本质是头文件)相当于 C#中的接口.今天就简单说明一下OC中的这两个文件. 由于视频中的Xcode版本低, ...

  3. 分类(Category)的本质 及其与类扩展(Extension) /继承(Inherit)的区别

    1.分类的概念 分类是为了扩展系统类的方法而产生的一种方式,其作用就是在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法. 如何创建一个分类?↓↓ ()Cmd+N, ...

  4. 关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol

    关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category, ...

  5. OC中分类(Category)和扩展(Extension)

    1.分类的定义 category是Objective-C 2.0之后添加的语言特性,中文也有人称之为分类.类别.Category的主要作用是为已经存在的类添加方法.这个大家可能用过很多,如自己给UIC ...

  6. Objective-C-----协议protocol,代码块block,分类category

    概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,本文将重点介绍objective-C中一些常用的语法特性. 当然这些内容虽然和其他高级语言 ...

  7. iOS中 分类(category)与扩展(Extension)的区别?

    1.分类(category)的作用 (1).作用:可以在不修改原来类的基础上,为一个类扩展方法.(2).最主要的用法:给系统自带的类扩展方法. 2.分类中能写点啥? (1).分类中只能添加“方法”,不 ...

  8. Objective-C中的协议(Protocol)和类别(Category)

    1.什么是协议? 2.协议与类别的声明和使用 1.什么是协议? 在Objective-C中,不支持多继承,即不允许一个类有多个父类,但是OC提供了类似的实现方法,也就是协议.协议有点类似于Java里的 ...

  9. Objective-C分类 (category)和扩展(Extension)

    1.分类(category) 使用Object-C中的分类,是一种编译时的手段,允许我们通过给一个类添加方法来扩充它(但是通过category不能添加新的实例变量),并且我们不需要访问类中的代码就可以 ...

随机推荐

  1. CSUOJ 2031 Barareh on Fire

    Description The Barareh village is on fire due to the attack of the virtual enemy. Several places ar ...

  2. win10怎么修改svn的用户和密码

    win10怎么修改svn的用户和密码(一般为默认),其他的系统也差不多 方法/步骤 1.方法一: 1.双击我的电脑在c盘找到auth文件夹 C:\Users\系统帐户名\AppData\Roaming ...

  3. 表单验证插件validate

    http://www.runoob.com/jquery/jquery-plugin-validate.html <!DOCTYPE html> <html lang="e ...

  4. 【Trie】【枚举约数】Codeforces Round #482 (Div. 2) D. Kuro and GCD and XOR and SUM

    题意: 给你一个空的可重集,支持以下操作: 向其中塞进一个数x(不超过100000), 询问(x,K,s):如果K不能整除x,直接输出-1.否则,问你可重集中所有是K的倍数的数之中,小于等于s-x,并 ...

  5. hdu 4560 拆点最大流 ***

    题意: 2013年一开始,一档音乐节目“我是歌手”就惊艳了大家一回.闲话少说,现在,你成为了这档节目的总导演,你的任务很简单,安排每一期节目的内容. 现 在有N个歌手,M种歌曲流派(Rock,Pop之 ...

  6. react中的children使用方法

    使用过vue的小伙伴都知道vue中有个slot,也就是插槽,作用就是占位,那么再react中可以使用children来替代 父组件 render(){ return( <div> < ...

  7. 【原】Order属性决定了不同切面类中通知执行的先后顺序

    [障碍再现] MyBatis配置多数据源时,数据源切换失败. [原因分析]    自定义切面和Spring自带事务切面“即<aop:advisor>”执行的先后顺序导致数据源不能切换成功. ...

  8. Running CMD.EXE as Local System(转)

    Many times in the past I had to run an interactive command-line shell under the Local SYSTEM account ...

  9. COM/DCOM开发练习之进程内组件实例

    作者 : 卿笃军 题目说明: 仿照例题,在其基础上实现下面功能: 1)使用C++语言实现进程内组件,组件提供复数的加.减.乘.除等计算服务:client部分包含录入(实部和虚部分开录入)和查询部分. ...

  10. Android设备运用Clockworkmod Recovery恢复模式安装定制的Rom

    Clockworkmod Recovery是一个由Cyanogen团队开发的用于Android设备的第三方定制Recovery恢复模式,也称为CWM Recovery,具体它有什么用处呢?请看关于Go ...