1.什么是类别:
类别就是在原有类的基础上,不通过继承的方式,添加新的方法,分散类的实现,方法的私有化
(1)给系统原有的类添加新的方法,不能直接扩展属性
(2)分散类的实现:如 indexpathforrow这个方法本来是nsindexpath的,但是因为经常在tableview中使用,跟表的关系特别密切,所以吧这个方法以类别的形式声明在了tableview中
(3)方法的私有化,不在.h中声明的方法
2.类别和继承的区别
首先继承会创建新的类,类别不会
继承只有子类才可以实现扩展的属性和方法
既然说到类别不可以直接创建属性,那么就可以间接创建属性,方法
比如我们穿件一个uiview的类别,在.h文件中,添加一个属性stringTag
@interface UIView (StringTag)
/*
我们通过property描述属性
类别可以通过写set以及get方法来实现
扩展属性
这是一种间接方法
*/
@property (nonatomic,strong) NSString *stringTag;//
@end
.m文件
//导入runtime
#import <objc/runtime.h>
//runtime
@implementation UIView (StringTag)
- (void)setStringTag:(NSString *)stringTag
{
// @property (nonatomic,strong) NSString *stringTag;
// self.stringTag = @"张三";
/*
object:被关联的对象self
key:属性的名字 stringTag
value:赋值 张三
*/
//关联Associated
objc_setAssociatedObject(self, "stringTag", stringTag, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
- (NSString *)stringTag
{
//获取关联对象
// self.stringTag
/*
object:被关联的对象self
key:属性的名字 stringTag
注意:key与上面的key需要一致
*/
return objc_getAssociatedObject(self, "stringTag");
}
/*
在比如和NSString添加一个判断文件是否存在的属性
.h文件
@interface NSString (Extend)
@property (nonatomic,assign,readonly) BOOL isExsits;
@end
.m文件
- (BOOL)isExsits
{
NSFileManager *fileManager = [NSFileManager defaultManager];
return [fileManager fileExistsAtPath:self];
}
*/