美文网首页iOS之家selectoriOS开发
iOS - 类扩展与分类的区别

iOS - 类扩展与分类的区别

作者: Mitchell | 来源:发表于2015-08-08 16:07 被阅读29996次
    作者:Mitchell 
    

    类扩展 (Class Extension也有人称为匿名分类)##

    • 作用:
      • 能为某个类附加额外的属性,成员变量,方法声明
      • 一般的类扩展写到.m文件中
      • 一般的私有属性写到类扩展
    • 使用格式:
    @interface Mitchell()
    //属性
    //方法
    @end
    
    • 与分类的区别

      • 分类的小括号中必须有名字

    @interface 类名(分类名字)
    /方法声明/
    @end
    @implementation类名(分类名字)
    /方法实现/
    @end
    ```
    - 分类只能扩充方法,不能扩展属性和成员变量(如果包含成员变量会直接报错)。
    - 如果分类中声明了一个属性,那么分类只会生成这个属性的set、get方法声明,也就是不会有实现。
    - 举例说明:如果我们分别在,类扩展与分类中添加了两个属性,

    类扩展与类别1.1.png
    接下来在初始化方法中分别赋值,
    类扩展与类别1.1.png
    大家会看到在为在分类中所声明的属性textOne赋值的时候,崩溃了,那么我们来查看一下崩溃的原因:
    类扩展与类别1.3.png
    意思是说,我们所创建的对象中并没有textOne这个属性。也就是说虽然我们再类别中声明属性不会报错,但是@property并没有自动为我们设置的属性生成set、get方法
    • 再说一下我们为什么不能包含类的 .m文件,因为这样会重复包含另一个类的实现文件。

    相关文章

      网友评论

      • feng_dev:很棒很棒
      • 知行合一认知升级:这写了一半,后边怎么没了。
        再说一下我们为什么不能包含类的 .m文件,因为这样会重复包含另一个类的实现文件。
      • 大号鱼骨头:我想问个问题,这俩加载的时机是怎么样的?
      • fe4a5edc73de:类别给属性添加set和get方法,不是也可以吗?
        SmallTwo:@花生儿 关联也应该没成员变量把?
        花生儿:@老男孩19910717 如果不关联的话,没有成员变量。
      • 黑白色2577:我新建的类拓展文件只有一个.h文件,没有.m文件,请问你是如何实现类拓展并且可以在.m文件中添加自定义的实现的。
        知行合一认知升级:分类要新建.h .m 文件。扩展不用新建文件,在原来的.m文件中添加@interface就行了。当然 ,也可以 单独生成一个.h文件。
        Mitchell:@黑白色2577 你确定你建的是category啊
      • 侭情显現:大神,怎么给简书文章布局
        Mitchell:@侭情显現 搜markdown语法
      • niujieno1:写的不错
      • 7a946bf5d2ca:楼主 分类里可以利用关联来增加属性
        IT小青龙:@大博哥 同意您的观点,我也是在研究mj的刷新控件的时候才知道原来可以通过runtime去关联增加一个额外的属性,当时看到后疑惑了半天,去查了相关资料才恍然大悟
        7a946bf5d2ca:@Mitchell 我就是觉得应该严谨一点,我以前学的时候别人都是高速我分类里不能增加属性,结果被误导了好久,偶然才知道能利用runtime怎么加属性,惊呆了
        Mitchell:@大博哥 是可以通过runtime去增加属性。这里只是为了区分而区分。非常抱歉没有写清楚。

      本文标题:iOS - 类扩展与分类的区别

      本文链接:https://www.haomeiwen.com/subject/odnbqttx.html