一、分类
分类,也叫类别Category。是在不改变原有类的基础上,对类功能进行扩展。当然也可以定义属性,只不过属性默认不生成set与get方法,需自己手动实现。这里有个需要注意的地方是分类不能生成成员变量,否则编译器会报错!不过一般不建议在分类中定义属性,毕竟分类还是在于扩展类的功能,而不在于处理数据!
1.通过生成全局变量实现
/** UIView+Category.h **/
@interface UIView (Category)
@property (copy, nonatomic) NSString* name;
@end
/** UIView+Category.m **/
#import "UIView+Category.h"
NSString* _name;
@implementation UIView (Category)
- (void)setName:(NSString *)name {
_name = name;
}
- (NSString *)name {
return _name;
}
@end
2.通过runtime实现
@interface UIView (Category)
@property (copy, nonatomic) NSString* name;
@end
#import "UIView+Category.h"
#import <objc/runtime.h>
static NSString* key = @"key";
@implementation UIView (Category)
- (void)setName:(NSString *)name {
objc_setAssociatedObject(self, &key, name, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)name {
return objc_getAssociatedObject(self, &key);
}
@end
二、扩展
扩展就是将一些不需要暴露在外面的公有的属性写入扩展类中,使得属性可以在.m文件中使用。
@interface ViewController ()
@property (copy, nonatomic) NSString* name;
@property (copy, nonatomic) NSString* height;
@end