• Objective-C中继承和类别的比较:category&Inherit


    Category与Extension的区别:

    1. Extension 是匿名的Category。

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

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

     

     

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

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

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

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

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

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

     

    在Objective-C中,给一个类扩展一个其它方法,有两种实现方式:类别和继承。
    1.继承Inherit
    这个是面向对象语言都有的一个特性,子类会继承父类的方法和属性。
    对于以下情况,无法使用类别,必须使用继承。
    1)新扩展的方法与原方法同名,但是还需要使用父类的实现。因为使用类别,会覆盖原类的实现,无法访问到原来的方法。
    2)扩展类的属性,这个类别无法做到。
    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    //  ViewControllerEx.h
    @interface ViewControllerEx : UIViewController
    //自己需要添加的方法
    @end
    // ViewControllerEx.m
    @implementation ViewControllerEx
    // 方法的实现
    @end



    2.类别category
    这是Objective-C语言的一个特性,可以在不改变类名和原来类的实现的前提下,实现对类的方法扩展。
    以下两种方式最后使用类别。
    1)针对系统提供的一些类,例如:NSString,NSArray,NSNumber等类,系统本身不提倡使用继承去扩展方法,因为这些类内部实现对继承有所限制,所以最后使用类别来进行方法扩展。
    2)类别支持开发人员针对自己构建的类,把相关的方法分组到多个单独的文件中,对于大型而复杂的类,这有助于提高可维护性,并简化单个源文件的管理。
    示例代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 这里有一个约定俗成的规定,类别文件命名时,是原类名+扩展标识名
    //  NSString+ex.h
    @interface NSString (ex)
    // 扩展的类回别方法
    @end
    //  NSString+ex.m
    @implementation NSString (ex)
    // 方法的实现
    @end
  • 相关阅读:
    汉罗塔
    汉罗塔动画实现
    画五星红旗
    科学与可视化
    类和正则表达式
    圆周率
    汉诺塔
    jieba库
    Python图片处理
    随手笔记
  • 原文地址:https://www.cnblogs.com/iOSJason/p/5033022.html
Copyright © 2020-2023  润新知