iOS - 类别和扩展(Categories和Extensions)

分类(Category)

分类能够做到的事情主要是:即使在你不知道一个类的源码情况下,向这个类添加扩展的方法。

此外,分类能够保证你的实现类和其他的文件区分开。

1 #import “UIViewController.h”
2 @interface UIViewController(CustomView)
3 -(void)extMethod;
4 @end

使用分类为类添加方法(Add Methods to Classes)

通过在interface中声明一个额外的方法并且在implementation 中定义相同名字的方法即可。分类的名字(也就是括号括起来的CustomView)表示的是:对于声明于其他地方的这个类(UIViewController),在此处添加的方法是额外的,而不是表示这是一个新的类。你不可以通过分类为一个类添加额外的成员变量。

在implementation中,引入头文件的时候主要引用的方式是:

1 #import “UIViewController+CustomView.h”
2 @implementation UIViewController(CustomView)
3 -(void)extMethod;
4 @end

另外,虽然Category不能够为类添加新的成员变量,但是Category包含类的所有成员变量,即使是@private的。Category可以重新定义新方法,也可以override继承过来的方法。

类扩展(Class Extensions)

类扩展就像匿名(也就是没有那个括号里面的名字CustomView)的分类一样,除了一样不同的是,类扩展声明必须在@implementation在实现。

先看一段代码:

1 @interface MyObject:NSObject
 2 {
 3 NSNumber* number;
 4 }
 5 -(NSNumber*)getNum;
 6 @end
 7
 8 @interface MyObject(Setter)
 9 -(void)setNum:(NSNumber*)num;
10 @end
11
12 @implementation MyObject
13 -(NSNumber*)getNum
14 {
15 return number;
16 }

看上面这段代码,有没有问题?编译器编译的时候,这段代码是可以编译通过,但当运行时,就会报错。为什么?

因为没有实现Category中的setNum方法。而用类扩展去实现,请看:

1 @interface MyObject:NSObject
 2 {
 3 NSNumber* number;
 4 }
 5 -(NSNumber*)getNum;
 6 @end
 7
 8 @interface MyObject() //注意这里的括号里面是没有名字的
 9 -(void)setNum:(NSNumber*)num;
10 @end
11
12 @implementation MyObject
13 -(NSNumber*)getNum
14 {
15 return number;
16 }
17
18 -(void)setNum:(NSNumber*)num
19 {
20 number = num;
21 }
22 @end

setNum是必须要实现,不然编译器会提出警告。

从上面看出,分类和类扩展的相似之处是:都可以为类添加一个额外的方法;

不同之处在于:要添加额外方法,分类必须在第一个@interface中声明方法,并且在@implementation中提供实现,不然运行时出错。而类扩展,你添加的方法是一个required API,如果不去实现,编译器会警告,而且这个方法的声明可以不在第一个@interface中去声明。

时间: 2024-10-16 23:47:47

iOS - 类别和扩展(Categories和Extensions)的相关文章

IOS 类别与扩展的区别 (category & extensions)

类别 .h @interface NSString(XXXXXX) -(NSInteger)getLen; @end .m @implementation NSString(XXXXXX) -(NSInteger)getLen { return 0; } @end //////////////////////////////////////////////////////////////////////////////////////////////////// 扩展 .h @interface

ios 类别和扩展-赵小波

类别 @interface ClassName ( CategoryName ) // method declarations @end Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性. 注意事项 1:类别是类的扩展,只可以声明方法,不可以声明变量.并且,类别的方法优先级较高,可覆盖原类方法. 2:类别的方法中,不可以调用super方法.--类别的局限 3:catego

iOS开发之类别、扩展

类别: 在ios项目开发中允许使用类别为现有的类添加新的方法,并不需要创建子类.通过类别我们可以动态地为现有的类添加新的方法,可以将类的定义模块化地布局到多个相关文件中. 使用类别的好处为: 一.进行模块化设计 二.利用类别来调用私有方法 接口部分格式如下: @interface 已有类 (类别名) //方法的定义 ..... @end 注意:类别中通常只定义新的方法. 类别的实现部分的语法格式如下: @implmentation 已有类(类别名) //方法的实现 @end 我先创建一个old类

iOS类别Category与扩展Extension

本文主要是详解iOS类别(Category)与扩展(Extension,匿名类别),请登陆疯狂软件教育官网.Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性. [objc] view plaincopy在CODE上查看代码片派生到我的代码片 #import @interface NSObject (Category) - (void)myMethod; @end 这是一个

[ios]objective-c中Category类别(扩展类)专题总结

本文转载至 http://yul100887.blog.163.com/blog/static/20033613520126333344127/ objective-c类别的作用?通过类别的方式,可以将类的实现分散到不同的文件里. 类别类别是一种为现有的类添加新方法的方式.利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类.类别使得无需创建对象类的子类就能完成同样的工

ios 中Category类别(扩展类)专题总结

原创地址   http://www.code4blog.com/archives/294 类别 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类. 类别使得无需创建对象类的子类就能完成同样的工作 一.创建类别 1.声明类别 声明类别与声明类的形式很相似 @interface  NSString(NumberConvenienc

分类(Category) 类扩展(Class Extensions)

使用Category需要注意的点: (1) Category的方法不一定非要在@implementation中实现,也可以在其他位置实现,但是当调用Category的方法时,依据继承树没有找到该方法的实现,程序则会崩溃. (2) Category理论上不能添加变量,但是可以使用@dynamic 来弥补这种不足. Extension非常像是没有命名的类别. Extension中的方法必须在@implementation中实现,否则编译会报错. 分类和类扩展的相似之处是:都可以为类添加一个额外的方法

iOS类别(Category)

iOS类别(Category)与扩展(Extension) 苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最大程度的体现了Objective-C的动态语言特性. #import @interface NSObject (Category) - (void)myMethod; @end 这是一个最简单的Category,作用于NSObject类,给NSObject添加了一个方法. 使用Category需要注

objective-c中Category类别(扩展类)专题总结

objective-c中Category 类别.扩展 专题总结 http://blog.csdn.net/jiajiayouba/article/details/21105873 分类: IOS 2014-03-12 18:19 1293人阅读 评论(0) 收藏 举报 类别扩展 objective-c中Category类别(扩展类)专题总结 objective-c类别的作用? 通过类别的方式,可以将类的实现分散到不同的文件里. haoxue 2011-11-19 14:03 类别 类别是一种为现