类别

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];

}

*/

 
原文地址:https://www.cnblogs.com/hualuoshuijia/p/5034870.html