1. 分類(Categories)
類擴(kuò)展可以增加屬性和成員變量,一般寫在.m里,所以一般為私有的
而分類可以寫在.h 或者 .m 里寫在.m就變成了私有的方法
分類優(yōu)先級(jí)比原類的優(yōu)先級(jí)較高,如果重寫將覆蓋原類的方法
如果非要添加屬性和成員變量,可以使用runtime來添加 ,必須自己實(shí)現(xiàn)set 和 get方法
#import
@interface NSObject (Category) ?// 有具體的類名(大致的功能)
- (void)myMethod;
@end
為類添加額外的方法,
(1) 不一定要在@implementation中實(shí)現(xiàn),但是找不到實(shí)現(xiàn)會(huì)報(bào)錯(cuò)
(2) Category理論上不能添加變量滚澜,但是可以使用@dynamic 來彌補(bǔ)這種不足而姐。 (即運(yùn)行時(shí)Runtime) ?并手動(dòng)實(shí)現(xiàn) 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); // 移除這個(gè)對(duì)象(button)的所有關(guān)聯(lián)對(duì)象
objc_setAssociatedObject(self, &overviewKey, block, OBJC_ASSOCIATION_COPY_NONATOMIC);//設(shè)置
[self addTarget:self action:@selector(callActionBlock:) forControlEvents:event];
}
}
- (void)callActionBlock:(id)sender {? // 獲取關(guān)聯(lián)對(duì)象
ActionBlock block = (ActionBlock)objc_getAssociatedObject(self, &overviewKey);
if (block) {
block();
}
}
@end
不實(shí)現(xiàn),運(yùn)行會(huì)報(bào)錯(cuò)
2.類擴(kuò)展(Extensions)
不實(shí)現(xiàn),直接警告 ,必須在@implementation中實(shí)現(xiàn),
類擴(kuò)展像是沒有命名的類別
定義的變量可以聲明在.m里,私有的,也可以聲明在.h里就是共有的
方法要在.m里實(shí)現(xiàn)