Objective-C中范畴与类扩展
2018-02-09 17:40
288 查看
一、objective-c中
1. XCode中创建范畴(Category)
CMD+N -> Objective-C File -> File Type -> Category
2. XCode中创建类扩展(Extension)
CMD+N -> Objective-C File -> File Type -> Extension
三、范畴(Category)和类扩展(Extension)的区分
范畴和类一样,都是在接口文件中声明,在类文件中实现。但是范畴中不能声明实例变量,只能声明方法,声明的方法既可以是类方法也可以是实例方法。
在一个类中如果有很多方法,把所有实现部分都写在一个文件里比较不方便,这种情况下,可以通过范畴类将类的实现部分以模块为单位分散到多个不同的文件中,也就是把范畴作为类的子模块来使用。
范畴的语法
类名部分为范畴所属的类的名字或即将添加该范畴的类的名字。类名必须是已经存在的类,不能为一个不存在的类定义范畴。
==范畴的声明:==
@interface 类名(范畴名)
方法的声明;
。。。
@end
==范畴的定义:==
@implementation 类名(范畴名)
方法的定义;
。。。
@end
范畴的接口部分需要遵循以下几个原则:
范畴的接口部分必须引用主文件的接口部分
范畴的实现部分必须引用对应的接口文件
使用范畴中的方法时必须引用这个方法所在的头文件
除了要调用范畴部分中定义的方法之外,主文件接口部分中不会引用各个范畴的接口文件和实现文件。范畴的接口部分可以声明在包含主文件接口的头文件中,也可以为每个范畴部分单独定义一个头文件。每个实现文件都可以被单独编译。实现文件一般命名为“类名+范畴名.m”。
以下代码为上述两种方式的示例:
==只有一个接口文件时范畴定义示例==
这种实现方法的可扩展性非常好,但编译器在连接时不会检查是否所有的范畴都被链接到了可执行文件中。
为此,类扩展被引入进来。类扩展的声明和范畴相似,只是圆括号之间没有文本。如下
部分转载于:https://www.jianshu.com/p/7c133b6707d2
1. XCode中创建范畴(Category)
CMD+N -> Objective-C File -> File Type -> Category
2. XCode中创建类扩展(Extension)
CMD+N -> Objective-C File -> File Type -> Extension
三、范畴(Category)和类扩展(Extension)的区分
关于范畴
实现某个类的一部分方法的模块叫做范畴或者类别。一个类既可以不适用任何范畴,也可以由多个范畴构成。范畴和类一样,都是在接口文件中声明,在类文件中实现。但是范畴中不能声明实例变量,只能声明方法,声明的方法既可以是类方法也可以是实例方法。
在一个类中如果有很多方法,把所有实现部分都写在一个文件里比较不方便,这种情况下,可以通过范畴类将类的实现部分以模块为单位分散到多个不同的文件中,也就是把范畴作为类的子模块来使用。
范畴的语法
类名部分为范畴所属的类的名字或即将添加该范畴的类的名字。类名必须是已经存在的类,不能为一个不存在的类定义范畴。
==范畴的声明:==
@interface 类名(范畴名)
方法的声明;
。。。
@end
==范畴的定义:==
@implementation 类名(范畴名)
方法的定义;
。。。
@end
范畴的接口部分需要遵循以下几个原则:
范畴的接口部分必须引用主文件的接口部分
范畴的实现部分必须引用对应的接口文件
使用范畴中的方法时必须引用这个方法所在的头文件
除了要调用范畴部分中定义的方法之外,主文件接口部分中不会引用各个范畴的接口文件和实现文件。范畴的接口部分可以声明在包含主文件接口的头文件中,也可以为每个范畴部分单独定义一个头文件。每个实现文件都可以被单独编译。实现文件一般命名为“类名+范畴名.m”。
以下代码为上述两种方式的示例:
==只有一个接口文件时范畴定义示例==
头文件Card.h #import <Foundation/NSObject.h> @interface Card : NSObject { ... } -(void)methodA; -(void)methodB; @end @interface Card (Display) -(void)methodP; @end @interface Card (Sort) -(void)methodX; -(void)metodY; @end文件Card.m
@implementation Card - (void)methodA {...} - (void)methodB {...} @end文件Card+Display.m
#import "Card.h" @implementation Card (Display) - (void)methodP {...} @end文件Card+Sort.m
@implementation Card (Sort) - (void)methodX {...} - (void)methodY {...} @end单独定义头文件时的范畴定义示例
Card.h #import <Foundation/NSObject.h> @interface Card : NSObject { ... } - (void)methodA; - (void)methodB; @end头文件Card+Display.h
#import "Card.h" @interface Card (Display) - (void)methodP; @end头文件Card+Sort.h
#import "Card.h" @interface Card (Sort) - (void)methodX; - (void)methodY; @end文件Card.m
#import "Card.h"文件Card+Display.m
@implementation Card - (void)methodA {...} - (void)methodB {...} @end
#import "Card+Display.h" @implementation Card (Display) - (void)methodP {...} @end文件Card+Sort.m
#import "Card+Sort.h"
@implementation Card (Sort) - (void)methodX {...} - (void)methodY {...} @end
关于类扩展
把类分为多个范畴来实现的情况下,主类和各个范畴都是独立的,每个范畴都不清楚其他的部分,有的范畴可能是执行前加载的,有的范畴可能是执行时动态加载的。这种实现方法的可扩展性非常好,但编译器在连接时不会检查是否所有的范畴都被链接到了可执行文件中。
为此,类扩展被引入进来。类扩展的声明和范畴相似,只是圆括号之间没有文本。如下
@interface Card () - (BOOL)hasSameSuit:(Card *)obj; @end==但是与范畴不同的是,使用类扩展可以增加实例变量如下:==
@interface Card () { BOOL flag; } - (BOOL)hasSameSuit:(Card *)obj; @end类扩展中声明的方法需要在类的实现文件中实现。
部分转载于:https://www.jianshu.com/p/7c133b6707d2
相关文章推荐
- Objective-c扩展方法的一种:延展
- Objective-C分类 (category)和扩展(Extension)
- objective-c中Category类别(扩展类)专题总结
- Objective-C 编程语言(6)类别与扩展----为类增加方法
- Objective-C之协议、代码块、分类、扩展
- 扩展方法,Objective-C
- 5.类的扩展之objective-c
- [ios]objective-c中Category类别(扩展类)专题总结
- objective-c之类别与扩展
- Objective-C 编程语言(6)类别与扩展----类别的使用
- 《Objective-C编程全解》 读书笔记 第十章 范畴
- Objective-C(一、文件扩展名,驼峰标识法,#import与#include,OC弱语法)——iOS开发基础
- 《Objective-C基础教程》第二章 对C的扩展
- Objective-C----Category 类别、Extension 扩展 专题总结
- Objective-C——扩展(Extension)详解
- Objective-C 学习笔记 - part 6 - 类别与扩展
- Objective-C基础8 : 类扩展(class extension)
- IOS学习三:Objective-C的扩展OOP,类别,内存管理等
- objective-C中的扩展方法与partial class
- Objective-C代码的文件扩展名