美文网首页
iOS-分类 Category

iOS-分类 Category

作者: 凛冬将至2002 | 来源:发表于2019-04-21 14:52 被阅读0次

Category(objc_category)

Category是表示一个指向分类的结构体的指针,其定义如下:

struct category_t { 
    const char *name; 
    classref_t cls; 
    struct method_list_t *instanceMethods; 
    struct method_list_t *classMethods;
    struct protocol_list_t *protocols;
    struct property_list_t *instanceProperties;
};
name:是指 class_name 而不是 category_name。
cls:要扩展的类对象,编译期间是不会定义的,而是在Runtime阶段通过name对 应到对应的类对象。
instanceMethods:category中所有给类添加的实例方法的列表。
classMethods:category中所有添加的类方法的列表。
protocols:category实现的所有协议的列表。
instanceProperties:表示Category里所有的properties,这就是我们可以通过objc_setAssociatedObject和objc_getAssociatedObject增加实例变量的原因,不过这个和一般的实例变量是不一样的。

结构体主要包含了分类定义的实例方法与类方法,其中instance_methods 列表是 objc_class 中方法列表的一个子集,而class_methods列表是元类方法列表的一个子集。

分类优点

  • 声明私有方法
  • 分解体积庞大的类文件
  • 把Framework私有方法公开
  • 模拟多继承(另外可以模拟多继承的还有protocol)

question1?Category 为什么不能添加实例变量,但可以添加属性

1.属性。Property
2.实例变量。Ivar(属性是给成员变量默认添加了setter和getter方法。tips:如果不用@dynamic修饰的话。)
3.isa指针。在Objective-C中,任何类的定义都是对象。类和类的实例(对象)没有任何本质上的区别。任何对象都有isa指针。但是分类没有。

分类没有自己的isa指针.“类最开始生成了很多基本属性,比如IvarList,MethodList。分类只会将自己的method attach到主类,并不会影响到主类的IvarList。这就是为什么分类里面不能增加成员变量的原因”,实例变量没有setter和getter方法。也没有自己的isa指针。所以,就算系统不报错也不能用。

question2?怎么添加属性

从下图可以看到。分类添加成员变量报错。添加属性不报错,但是会有警告。并且告诉我们要的去添加setter和getter方法或者用@dynamic修饰。(注意:用@dynamic修饰只是告诉属性setter和getter必须要自己声明。只能解出警告。不能解决问题。运行时会崩溃)




相关文章

  • 2-1 分类 类后面加括号

    1.什么是分类 = 类别。通过runtime将方法添加进 类里面 iOS-分类(Category)[https:...

  • iOS-Category原理

    参考篇:iOS-分类(Category) 前言:本文简述Category原理,如有错误请留言指正。 第一部分:有关...

  • iOS-分类(Category)

    Category是Objective-C 2.0之后添加的语言特性,分类、类别其实都是指的Category。Cat...

  • iOS-分类(Category)

    在iOS开发中我们常使用Category来给类添加方法或者属性,原理是什么呢. 分类概况 我们先尝试写个分类.NS...

  • iOS-分类 Category

    Category(objc_category) Category是表示一个指向分类的结构体的指针,其定义如下: 分...

  • iOS-底层-Category分类

    iOS中的Category我们经常使用,主要是给一些类添加新的方法,或者拆分类。进行方法调用的时候,如果调用的是写...

  • iOS 开发:Runtime(详解四)Category

    1. Category (分类)简介 1.1 什么是 Category(分类)? Category(分类)主要作用...

  • AVPlayer音乐锁屏功能

    [iOS]iOS AudioSession详解 Category选择 听筒扬声器切换iOS- 关于AVAudioS...

  • iOS基础总结理解及相关面试题

    iOS基础 分类(Category)和类扩展(Class Extension)分类(Category)Catego...

  • 分类(Category)与类拓展(Extension)

    分类(Category) 1.分类(Category)是什么? 分类是oc特有的语法,表示指向分类的结构体指针。分...

网友评论

      本文标题:iOS-分类 Category

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