category为什么不能添加属性

首先要明白什么是属性:

属性 = ivar + setter + getter(成员变量+setter方法+getter方法)。

在category中添加属性,category只会声明setter,getter,而不会去实现。编译的时候,是可以通过的,但是会报警告。

在别处调用这个属性的setter、getter方法,程序也会闪退。

如果要想实现,就要用runtime手动实现setter、getter方法。

在getter、setter方法中分别使用objc_getAssociatedObject、objc_setAssociatedObject动态获取、绑定这个属性。

category的结构体定义如下:

struct category_t {

constchar*name;//类的名字(name)

classref_t cls;//类(cls)

struct method_list_t *instanceMethods; //category中所有给类添加的实例方法的列表(instanceMethods)

struct method_list_t *classMethods;//category中所有添加的类方法的列表(classMethods)

struct protocol_list_t *protocols; //category实现的所有协议的列表(protocols)

struct property_list_t *instanceProperties;//category中添加的所有属性(instanceProperties)

};

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 学习写简书博客,每次写简书都是对过往的回顾 前言 这段时间换工作,发现面试经常会问到一个问题:分类中能不能定义实例...
    cs_mark阅读 4,782评论 8 22
  • 那么根本原因又是什么呢?原因:分类没有自己的isa指针.“类最开始生成了很多基本属性,比如IvarList,Met...
    Adam_潜阅读 486评论 0 0
  • category是在程序加载运行的时候,才加载到内存中,此时各个类的内存布局已经确定了,不可以再更改。 可以加属性...
    三岁就很乖阅读 891评论 0 0
  • 一 类别的简介 在开发中有时会用到Category,类别有三个作用: (1)可以将类的实现分散到多个不同文件或多个...
    々莫等闲々阅读 452评论 0 0
  • 失败者——《心花路放》 每个人的每一生都有一些失败的时刻,那个时刻是失去了人生中最重要的某一部分东西,这些东西是你...
    e991f96e8f58阅读 758评论 0 0