category相关
category功能
- 将代码和逻辑分散到不同的页面
- 优雅的实现代码的复用
- 通过在category中生命原来类的私有方法,可以让外界调用原来类的私有方法
- 向对象添加非正式协议
将代码和逻辑分散到不同的页面、优雅的实现代码的复用
这个是我们使用类别的最简单,最常见的情形,不解释了。
通过在category中生命原来类的私有方法,可以让外界调用原来类的私有方法
A是一个类,A+B是一个A的category。A有一个私有方法func。可以在A+B的.h文件里生命func方法,.m里不用实现。那么import A+B的类,都可以调用A的func方法了。
向对象添加非正式协议
凡是NSObject或其子类的类别,都是非正式协议。因为所有的类都继承自NSObject,所以只要在任何类中引入NSObject+XXX,就可以调用这个类别中的方法了。
category增加属性
情形一:只是看上去增加了属性,其实没有增加
例如我们常用的View的category代码:
.h的代码如下:
@interface UIView (Size)
@property (nonatomic, assign) CGFloat left;
.m的代码如下:
- (CGFloat)left;
{
return CGRectGetMinX([self frame]);
}
为什么说是看上去增加了属性呢,因为实际上根本没有增加任何属性,只不过增加了left的getter和setter方法。方法的实现也完全没有用到原来没有的属性。
情形二:实实在在的增加了属性
有时候我们就是要实现一个新的属性,那么可以通过运行时去实现
代码如下:
//NSObject+IndieBandName.h
@interface NSObject (IndieBandName)
@property (nonatomic, strong) NSString *indieBandName;
@end
// NSObject+IndieBandName.m
#import "NSObject+Extension.h"
#import <objc/runtime.h>
static const void *IndieBandNameKey = &IndieBandNameKey;
@implementation NSObject (IndieBandName)
@dynamic indieBandName;
- (NSString *)indieBandName {
return objc_getAssociatedObject(self, IndieBandNameKey);
}
- (void)setIndieBandName:(NSString *)indieBandName {
objc_setAssociatedObject(self, IndieBandNameKey, indieBandName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
什么是extension
首先iOS里extension并不是继承(java使用extends关键字表示继承,OC并不是。。)
extension其实就是.m里的interface里定义的那些东西,可以重新对.h里的属性进行读写属性的更改,可以新定义方法,还可以增加属性等。
和category的区别:
*Category的小括号中有名字,而Extension没有;
*Category只能扩充方法,不能扩充成员变量和属性;
*extension定义的方法必须实现。

浙公网安备 33010602011771号