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

1. 分类(Categories)

类扩展可以增加属性和成员变量,一般写在.m里,所以一般为私有的

而分类可以写在.h 或者 .m 里写在.m就变成了私有的方法

分类优先级比原类的优先级较高,如果重写将覆盖原类的方法

如果非要添加属性和成员变量,可以使用runtime来添加 ,必须自己实现set 和 get方法

iOS-分类(Categories)和类扩展(Extensions)_第1张图片
在.h公开 (用到runtime,所以添加了属性)
iOS-分类(Categories)和类扩展(Extensions)_第2张图片
在.m私有

#import

@interface NSObject (Category)  // 有具体的类名(大致的功能)

- (void)myMethod;

@end

为类添加额外的方法,

(1) 不一定要在@implementation中实现,但是找不到实现会报错

(2) Category理论上不能添加变量,但是可以使用@dynamic 来弥补这种不足。 (即运行时Runtime)  并手动实现 set get方法;

.h

#import#importtypedef void (^ActionBlock)();

@interface UIButton (Block)

@property (nonatomic, copy) NSString *Type;

@property (readonly) NSMutableDictionary *event;

- (void) handleControlEvent:(UIControlEvents)controlEvent withBlock:(ActionBlock)action;

@end

.m

#import "UIButton+Block.h"

@implementation UIButton (Block)

static char overviewKey;

static char buttonType;

@dynamic event;

@dynamic Type;

- (void)setType:(NSString *)Type {

objc_setAssociatedObject(self, &buttonType, Type, OBJC_ASSOCIATION_COPY_NONATOMIC);

}

- (NSString *)Type {

NSString *Type = objc_getAssociatedObject(self, &buttonType);

return Type;

}

- (void)handleControlEvent:(UIControlEvents)event withBlock:(ActionBlock)block {

if (block) {

objc_removeAssociatedObjects(self); // 移除这个对象(button)的所有关联对象

objc_setAssociatedObject(self, &overviewKey, block, OBJC_ASSOCIATION_COPY_NONATOMIC);//设置

[self addTarget:self action:@selector(callActionBlock:) forControlEvents:event];

}

}

- (void)callActionBlock:(id)sender {  // 获取关联对象

ActionBlock block = (ActionBlock)objc_getAssociatedObject(self, &overviewKey);

if (block) {

block();

}

}

@end

不实现,运行会报错

2.类扩展(Extensions)

不实现,直接警告 ,必须在@implementation中实现,

类扩展像是没有命名的类别

iOS-分类(Categories)和类扩展(Extensions)_第3张图片

定义的变量可以声明在.m里,私有的,也可以声明在.h里就是共有的

方法要在.m里实现

你可能感兴趣的:(iOS-分类(Categories)和类扩展(Extensions))