iOS知识梳理 - category和extension

栏目: IOS · 发布时间: 6年前

内容简介:category主要作用是在不改变原有类的前提下,动态地给这个类添加一些方法。苹果早年一份这里我们逐个分析。

category和extension

category的能力

category主要作用是在不改变原有类的前提下,动态地给这个类添加一些方法。

苹果早年一份 官方文档 指出,category主要有三种用途:

  1. 给现有的类添加方法;
  2. 将一个类的实现拆分成多个独立的源文件;
  3. 声明私有的方法。

这里我们逐个分析。

1. 给现有的类添加方法

常见。比如给UIColor添加一些跟16进制色值互转的方法。如下:

@interface UIColor (Hex) 

+ (UIColor*) colorWithHex: (NSUInteger) hex;

@end
@implementation UIColor (Hex)

+ (UIColor*) colorWithHex: (NSUInteger)hex {
    CGFloat red, green, blue, alpha;

    red = ((CGFloat)((hex >> 16) & 0xFF)) / ((CGFloat)0xFF);
    green = ((CGFloat)((hex >> 8) & 0xFF)) / ((CGFloat)0xFF);
    blue = ((CGFloat)((hex >> 0) & 0xFF)) / ((CGFloat)0xFF);
    alpha = hex > 0xFFFFFF ? ((CGFloat)((hex >> 24) & 0xFF)) / ((CGFloat)0xFF) : 1;

    return [UIColor colorWithRed: red green:green blue:blue alpha:alpha];
}
@end

2. 将一个类的实现拆分成多个独立的源文件

这种在小项目中可能少见一些,但在大型项目中比较多。比如某日活过亿的iOS软件,其配置系统中大约有400份配置,很多功能根据配置的内容会有不同的表现,不同用户拉取不同内容的配置。

这400份配置会在用户首次登陆时全量拉取,在以后登陆时增量拉取。注意这都是一条请求带回来的。

如果把这400份配置的解析处理都写到一个文件里,这个文件显然会膨胀到一个很恐怖的地步。最好的方式就是让每个业务添加自己的分类,在分类中处理自己的配置内容。

当一个类可能过于膨胀的时候,通过分类进行拆分是比较好的做法。

3. 声明私有的方法

一开始看到这个玩意儿的时候我简直一头雾水。

方法不想暴露出去就不要声明不就好了嘛???搜了半天才理清楚里面的来龙去脉。

最早的上古年代,那时候objc所有的方法都是要声明的,无论是是否想要暴露出去。

不想暴露出去的方法就需要一个内部category来进行声明。

如下:

// MyClass.m
@interface MyClass (privatemethods)
- (void)myPrivateMethod;
@end

@implementation MyClass
- (void)myPrivateMethod {
    // Implementation goes here
}
@end

过了一阵子,官方觉得这样写有点累赘。于是做了一丢丢简化:

// MyClass.m
@interface MyClass ()
- (void)myPrivateMethod;
@end

@implementation MyClass
- (void)myPrivateMethod {
    // Implementation goes here
}
@end

在这种情况下可以去掉category的名字,这种语法被称为 Extension

再后来,进一步简化,私有方法不再需要定义了,不过私有属性和成员变量仍然放在extension中。

// MyClass.m
@interface MyClass ()
{
    BOOL _isFat;
}
@property (nonatomic,assign) BOOL isTall;
@end

@implementation MyClass
- (void)myPrivateMethod {
    // Implementation goes here
}
@end

目前为止,这种写法是我见过的最广泛的写法。

但是其实更新的语法推荐把成员变量放到implentation部分

// MyClass.m
@interface MyClass ()
@property (nonatomic,assign) BOOL isTall;
@end

@implementation MyClass
{
    BOOL _isFat;
}
- (void)myPrivateMethod {
    // Implementation goes here
}
@end

不过很少看到这么写了。

结语

本文主要挖了挖语法,

TODO:底层实现以后再runtime部分去做梳理。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Python for Everyone

Python for Everyone

Cay S. Horstmann、Rance D. Necaise / John Wiley & Sons / 2013-4-26 / GBP 181.99

Cay Horstmann's" Python for Everyone "provides readers with step-by-step guidance, a feature that is immensely helpful for building confidence and providing an outline for the task at hand. "Problem S......一起来看看 《Python for Everyone》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器