Category是Objective-C中常用的语法特性,通过它可以很方便的为已有的类来添加函数。但是Category不允许为已有的类添加新的属性或者成员变量。
一种常见的办法是通过runtime.h中objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象。通过这种方法来模拟生成属性。
下面是用来制作下拉刷新框架中使用到的一段代码
@interface UIScrollView (CWRefresh)
@property (nonatomic,strong) CWRefreshHeaderView *header;
@end
上面是声明,下面是头文件的生成
#import "UIScrollView+CWRefresh.h"
#import "CWRefreshHeaderView.h"
#import <objc/runtime.h>
@implementation UIScrollView (CWRefresh)
#pragma mark - header
// 关联
static char CWRefreshHeaderKey;
- (void)setHeader:(CWRefreshHeaderView *)header
{
if (header != self.header) {
[self.header removeFromSuperview];
[self willChangeValueForKey:@"header"];
objc_setAssociatedObject(self, &CWRefreshHeaderKey,
header,
OBJC_ASSOCIATION_ASSIGN);
[self didChangeValueForKey:@"header"];
[self addSubview:header];
}
}
- (CWRefreshHeaderView *)header
{
return objc_getAssociatedObject(self, &CWRefreshHeaderKey);
}
@end
这样就可以把header当成属性来使用啦。。可以在header上添加各种刷新时候的控件,以及动画啦