Fork me on GitHub

OC基础学习10:类别(category)

类别(category)是一种为现有的类添加新方法的方式。

1 创建类别

一般,只是习惯

把类别代码放在独立的文件中
命名:”类名称+类别名称”,如 NSString+NumberConvenience

  • 开始创建类别

生成两个文件,NSString+NumberConvenience.h:

1
2
3
4
5
#import <Foundation/Foundation.h>

@interface NSString (NumberConvenience)

@end

NSString+NumberConvenience.m:

1
2
3
4
5
#import "NSString+NumberConvenience.h"

@implementation NSString (NumberConvenience)

@end

类别名在括号中。
可以在@implementation部分实现自己的方法。任何NSString类的对象都将响应在类别中的方法。正是这种兼容性使类别成为了一种非常强大的概念。

  • 类别的缺陷

    1. 文法向类中添加新的实例变量。
    2. 名称冲突。类别中的方法与现有的方法重名时,类别中的方法会替代现有的方法。(可在类别名称加前缀)
  • 类别的优势

    1. 将类的实现分散到多个不同文件或多个不同框架中
    2. 创建对私有方法的前向引用
    3. 向对象添加非正式协议
  • 类扩展(class extentsion):特殊的类别

1
2
3
4
5
6
7
8
@interface Things : NSObject

@property (assign) NSInteger thing1;
@property (readonly, assign) NSInteger thing2;

- (void)resetAllValues;

@end
1
2
3
4
5
6
7
8
@interface Things()
{
NSInteger thing4;

}
@property (readwrite, assign) NSInteger thing2;
@property (assign) NSInteger thing3;
@end

2 利用类别分散实现代码

不能将@implementation分散到多个不同的.m文件中。可以通过类别把大型的单个类分散到多个不同的.m文件中。
以AppKit中的NSWindow为例,在NSWindow.h中搜索@interface大约能搜到5个类别声明:

1
2
3
4
5
@interface NSWindow(NSEvent)
@interface NSWindow(NSCursorRect)
@interface NSWindow(NSDrag)
@interface NSWindow(NSCarbonExtensions)
@interface NSWindow(NSDeprecated)

类别可以访问其继承的类的实例变量。

3 通过类别创建前向引用

没有真正的私有方法。不在头文件声明,也可以调用,不过编译器会提示警告,并且app store会拒绝上架。
可通过在类别中声明方法避免这种警告。

坚持原创技术分享,您的支持将鼓励我继续创作!
  • 本文标题: OC基础学习10:类别(category)
  • 本文作者: AndyRon
  • 发布时间: 2017年09月11日 - 22:43
  • 最后更新: 2018年09月19日 - 23:50
  • 本文链接: http://andyron.com/2017/oc-basic-10.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!