Objective-C基础之Category Extension

  1. category 官方文档中有如下描述

Rather than creating an entirely new class to provide minor additional capabilities over an existing class, it’s possible to define a category to add custom behavior to an existing class. You can use a category to add methods to any class, including classes for which you don’t have the original implementation source code, such as framework classes like NSString.

文档中说明,category并不是为已经存在的类创建一个新类提供一些小的附加功能,而是定义一个category去添加自定义行为,文档中还说明了,在没有已经存在的类实现源码,想要扩展类的选择的方式。

  1. extension 官方文档有如下描述

If you do have the original source code for a class, you can use a class extension to add new properties, or modify the attributes of existing properties. Class extensions are commonly used to hide private behavior for use either within a single source code file, or within the private implementation of a custom framewor

文档中说明,如果你有一个类的源码,那么你可以添加一个extension,添加属性、修改属性、添加方法,那么作用是影藏私有属性和方法,可以是一个单独的.h文件也可以是在一个私有实现文件里。

category extension总结:

  • category:1、为了在没有实现源码的基础上,为已有类添加方法
    2、创建为单独的.h 和.m 文件,声明的方法可以不给予实现,但是一旦调用到则会发生crash
    3、只能为已经存在的类添加方法,不能直接添加属性(添加属性会生成setter。getter的声明,但是不会生成实例变量和setter、getter方法的实现,可通过runtime 动态绑定对象实现添加方法)
    4、 categroy 和本类中同时实现同名函数,优先调用category中的方法
    5.多个category中实现同名函数,调用取决于编译顺序,最后一个编译的被调用
    6.运行期决议

  • extension(又称之为匿名的category):1、有源码的基础上,为类添加私有属性和方法
    2、可以将其生成一个单独.h文件,也可以将其放在类的实现文件里,声明的方法必须实现,否则编译器会报错
    3、可以添加属性和方法,但是属性和方法是私有的
    4、编译期决议,属于类的一部分

使用category的好处
1.为无实现源码的已有类添加方法(如系统框架中的类)
2.不同的功能组织到不同的category
3.减少单个文件体积
4.公开私有方法
5.多个开发者共同完成一个类
7.模拟多继承

为什么category 不能添加实例变量
1、category 本身结构不包括ivars存储链表,所以先天不具备合成实例变量的条件
2、类的内存布局在编译时期已经确定,category是运行时期才加载进内存的,所以不具备增加实例变量的条件

为什么使用objc_setAssociation可以添加实例变量
事实上关联的对象并不是直接存储于类结构里的,在AssociationsManager里的静态AssociationsHashMap存储的是以对象的指针地址作为key的map,而其value则是一个与这个对象关联的AssociationsHashMap,这个map存储的是关联的kv对。也就是说事实上就是将关联的对象存在了这个map中,并不是直接添加到ivars列表里的,所以关联对象并不是给对象添加实例变量的过程,也侧面证实了在运行时期,类的内存布局已经确定,从而不能添加实例变量。

以上总结参考文档 美团点评-深入了解Objective-C:category很好的文章,值得深入研究

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容