iOS分类和类扩展的基本使用

标签: Category Extension
16人阅读 评论(0) 收藏 举报
分类:

一、Category

Category:分类(类别、类目), 是Objective-C 的语法,顾名思义就是将一个类分成多个模块

Objective-C Runtime源码

typedef struct objc_category *Category;

struct objc_category {
	char *category_name;                          //分类名
	char *class_name;                             //分类所属的类名
	struct objc_method_list *instance_methods;    //实例方法列表
 	struct objc_method_list *class_methods;       //类方法列表
 	struct objc_protocol_list *protocols;         //分类实现的协议
};

根据源码可以看出, 这个分类结构体主要是给原有类添加方法的,而且结构体里也没有属性列表,所有原则上讲它只能添加方法, 不能添加属性

分类的语法格式:

@interface 待分类的类名(分类的名称)
@end

@implementation 待分类的类名(分类的名称)
@end

分类的作用:

1.将臃肿的类分为多个模块,方便管理
2.扩展一个类,给原来的类添加方法,特别是扩展系统自带的类或一些第三方框架
其中为系统的类写的分类也叫非正式协议

注意:
1.分类只能增加方法,不能增加属性
2.分类中的可以写@property, 但不会生成setter/getter方法
3.分类中可以访问原来类中的成员变量,但是只能访问@protect和@public形式的变量。如果想要访问本类中的私有变量,分类和子类一样,只能通过方法来访问。
4.如果分类中有和原有类同名的方法, 会优先调用分类中的方法, 就是说会忽略原有类的方法。
5.如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定,编译器会执行最后一个参与编译的分类中的方法。
可以在 TARGETS->Build Phases ->Compile Sources 修改(注意执行顺序是从上到下的)


二、Extension

Extension(类扩展)是Category的一个特例
特殊之处:
a.类扩展没有名字
b.只有声明没有实现,和原有的共享一个实现

类扩展格语法格式:

@interface 特扩展的类 ()

@end
作用:为一个类添加额外的原来没有变量,方法和属性
一般的类扩展写到.m文件中

一般的私有属性写到.m文件中的类扩展中

三、分类和类扩展的区别

1. 分类有名字,类扩展没有名字,是一个匿名的分类
2. 每一个分类都有单独的声明和实现,而类扩展只有声明,没有实现
3. 分类中只能新增方法,而类扩展不仅可以增加方法(必须实现),还可以增加实例变量(属性),该实例变量默认是@private类型的(用范围只能在自身类,而不是子类或其他地方)

4. 类扩展中声明的方法没被实现,编译器会报警,但是分类中的方法没被实现编译器是不会有任何警告的。这是因为类扩展是在编译阶段被添加到类中,而分类是在运行时添加到类中


查看评论

iOS分类(category),类扩展(extension)—史上最全攻略

本文会带你看懂分类,类扩展和匿名分类的前世今生,从看懂到会用。
  • u012946824
  • u012946824
  • 2016-07-01 11:05:26
  • 4190

iOS纪录-类别、扩展和继承的概念

1.类别(category)应用非常常见,特别是在为系统类进行扩展的时候,我们可以不用继承系统类,直接给系统类添加方法。最大程度上体现了OC语言的动态性。但是类别只能添加方法不能添加属性。 2....
  • rich_lucky
  • rich_lucky
  • 2016-01-12 23:39:16
  • 1107

iOS之类别(Category)、类扩展、继承的区别

iOS在2.0就已经推出类别(Category),它允许开发者在不改动原有类的情况下,对该类进行扩展使用。我们知道,OC 和 Swift 都具备单继承特性,我们也可以通过新建子类继承父类的方式,实现类...
  • LVXIANGAN
  • LVXIANGAN
  • 2017-08-01 12:09:19
  • 786

OC基础之类别(Category)和扩展(Extension)

类别(Category)类别文件的创建 1.新建文件 2.选择iOS平台Source中的Object-C Fie 3.选择File Type为Category,则可建立相应类的类别文件 类别文件...
  • csdn_howe
  • csdn_howe
  • 2016-11-29 16:01:19
  • 2184

iOS类别(Category)与扩展(Extension)

Category在iOS开发中使用非常频繁。尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性。 #impor...
  • smking
  • smking
  • 2014-09-02 18:07:03
  • 29164

谈谈iOS中Categories(分类)、Extensions(类扩展)和继承的区别

最近乱点了篇博客,点击打开链接 博主总结得乱七八糟,虽然这知识点太过久远,还是我来谈谈iOS中Categories(分类)、Extensions(类扩展)和继承的区别 吧。 简单的讲,通过Categ...
  • jaccty
  • jaccty
  • 2015-08-05 14:08:47
  • 933

iOS类别扩展无法识别添加方法

在ios开发中创建了类别扩展的文件,但总是识别扩展的原文件方法,在动态调用扩展方法时出现unrecognized selector sent to instance错误,看到国外网站的一个解决办法: ...
  • CDUT100
  • CDUT100
  • 2015-06-15 23:23:02
  • 1392

ios 类别和类扩展

一自定义分类打印字典转模型的属性声明 核心思想 与KVC赋值的区别 二两种字典转模型的代码 KVC方式字典转模型 runtime字典转模型 具体使用 本文分为两部分: 一:教你怎样一部获取成员...
  • haha_hello
  • haha_hello
  • 2017-04-26 19:16:46
  • 148

Objective-C_类的扩展

简单讲解Objective-C中类目、延展、协议、代理的定义和使用以及代码实现。
  • u013485543
  • u013485543
  • 2015-08-09 19:09:59
  • 492

类别(扩展类)编译成framework或.a后无法引用其方法

最近在编译一个iOS的静态库的时候出现了这样一个问题: 我在库中增加了类别的扩展例如: @interface NSNumber (XXX) + (NSNumber *)xxx_numberW...
  • prince_banana
  • prince_banana
  • 2015-02-13 14:11:33
  • 601
    个人资料
    持之以恒
    等级:
    访问量: 2060
    积分: 212
    排名: 34万+
    文章分类