美文网首页
为什么不能直接为category添加属性

为什么不能直接为category添加属性

作者: 张无奈 | 来源:发表于2018-08-02 10:55 被阅读0次

在类中使用@property,系统会自动生成带“_”的成员变量和该变量的setter和getter方法。也就是说,属性相当于一个成员变量加getter和setter方法

在分类里使用@property声明属性,只是将该属性添加到该类的属性列表,但是没有生成相应的成员变量,也没有实现setter和getter方法。

那么根本原因又是什么呢?

category 它是在运行期决议的。 因为在运行期即编译完成后,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的。

为什么使用Runtime又可以添加属性?

使用Runtime技术中的关联对象可以为类别添加属性。

其原因是:关联对象都由AssociationsManager管理,AssociationsManager里面是由一个静态AssociationsHashMap来存储所有的关联对象的。这相当于把所有对象的关联对象都存在一个全局map里面。而map的的key是这个对象的指针地址(任意两个不同对象的指针地址一定是不同的),而这个map的value又是另外一个AssAssociationsHashMap,里面保存了关联对象的kv对

这里说一下category和extension的区别?

extension看起来很像一个匿名的category,但是extension和有名字的category几乎完全是两个东西。 extension在编译期决议,它就是类的一部分,在编译期和头文件里的@interface以及实现文件里的@implement一起形成一个完整的类,它伴随类的产生而产生,亦随之一起消亡。extension一般用来隐藏类的私有信息,你必须有一个类的源码才能为一个类添加extension,所以你无法为系统的类比如NSString添加extension。(详见2)

但是category则完全不一样,它是在运行期决议的。 

就category和extension的区别来看,我们可以推导出一个明显的事实,extension可以添加实例变量,而category是无法添加实例变量的

相关文章

  • 为什么不能直接为category添加属性

    在类中使用@property,系统会自动生成带“_”的成员变量和该变量的setter和getter方法。也就是说,...

  • 分析Category、load、initialize的加载原理

    先来抛出3个问题:1.Category为什么不能直接添加属性?2.Category中有load方法吗?load方法...

  • iOS中的runTime

    运行时,我们最常见的可能就是创建类别(Category),为类别添加属性,类别是不能直接添加属性的,可以添加方法,...

  • Category 的 本质

    Category的实现原理,以及Category为什么只能添加方法不能添加属性 ?category的底层结构是st...

  • Category-关联对象

    分类添加属性 Category能否添加成员变量?如果可以,如何给Category添加成员变量?不能直接给Categ...

  • iOS开发 Category

    1.说下category原理,以及category为什么只能添加方法不能添加属性? 分类的实现是将category...

  • iOS Category分类

    1.说下category原理,以及category为什么只能添加方法不能添加属性? 分类的实现是将category...

  • 2018-05-17. Objective-C中给类别(Cate

    众所周知,类别(Category)是不能直接添加属性的,但是可以利用Runtime来关联对象添加属性。 首先,说一...

  • 笔记-关联对象

    目录 面试题 伪代码实现 Category添加属性的几种用法 Category为什么不能添加成员变量 底层源码解读...

  • iOS分类(category)为什么不能直接添加属性?

    从定义分析 先看一下分类的定义: 再看下 Class 的定义: 对比可以发现 category 中少了 struc...

网友评论

      本文标题:为什么不能直接为category添加属性

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