美文网首页
分类与类扩展(Category&Extension)

分类与类扩展(Category&Extension)

作者: Robinone | 来源:发表于2018-11-10 12:12 被阅读0次

一.分类(Category)

1.适用范围

  • 当我们需要给一个类(自定义类、系统类或第三方库)新增一个方法,并且不改动这个类,只需要给原来的类增加一个分类就可以实现。
  • 在协同开发中,我们将一个类拆成多个分类,在分类中实现类别声明,可以将一个类的实现写到不同的.m文件中,方便管理和协同开发。
  • 分类中的方法可以只声明,不实现。

2.格式

@interface 主类类名(分类类名)
//不可以定义成员属性
@end

@implementation 主类类名(分类类名)

@end

文件名通常为:主类名+分类名
调用方法时,只需要向主类引用发送消息即可。

3.注意

  • 1.分类中方法的优先级比原来类中的方法高,也就是说,在分类中重写了原来类中的方法,那么分类中的方法会覆盖原来类中的方法
  • 2.分类中只能声明方法,不能添加属性变量,在运行时分类中的方法与主类中的方法没有区别
  • 3.通常来讲,分类定义在.h文件中,但也可以定义.m文件中,此时分类的方法就变成私有方法

4.使用范例

定义UIImage类的分类
"UIImage+Image.h"文件:

@interface UIImage (Image)
//给定一个图片名称,生成不会被渲染的图片
+ (instancetype)imageWithOriginalImageName:(NSString *)imageName;
@end

"UIImage+Image.m"文件:

#import "UIImage+Image.h"

@implementation UIImage (Image)
+ (instancetype)imageWithOriginalImageName:(NSString *)imageName
{
    //修改图片渲染模式
    UIImage *image = [UIImage imageNamed:imageName];
    image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    return image;
}
@end

5.一般不能在分类(类别)中定义成员属性

  • Category是Objective-C中常用的语法特性,可以很方便的为已有的类添加函数。但是Category不允许为已有的类添加新的属性或者成员变量。
  • 常见的方法是通过runtime.h中objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象。通过这种方法来模拟生成属性。

二.类扩展(Extension)

1.适用范围

扩展是分类的一种特殊形式。

2.语法格式

@interface 主类类名() 
@end

扩展通常定义在主类.m文件中,扩展中声明的方法直接在主类.m文件中实现。

3.注意

  • 1.扩展中可以声明实例变量,可以声明属性
  • 2.扩展声明的方法和属性通常是私有的,因为扩展通常定义在主类的.m文件中

4.分类和扩展的区别

  • 1.分类是不可以声明实例变量,通常是公开的,文件名是:主类名+分类名.h
  • 2.扩展是可以声明实例变量,是私有的,文件名为:主类名_扩展标识.h,在主类的.m文件中#import该头文件

5.使用范例

定义 RBTabBar类的扩展

  • 方式1:以单独的文件定义 “RBTabBar_ExtensionTabBar.h”文件:
#import "RBTabBar.h"
@interface RBTabBar ()
@property (nonatomic, strong) UIButton *selectedBtn;
- (void)test;
@end
  • 方式2:在主类的.m文件中定义,并且实现扩展定义的方法
    “RBTabBar.m”文件:
#import "RBTabBar.h"
@interface RBTabBar ()
@property (nonatomic, strong) UIButton *selectedBtn;
- (void)test;
@end

@implementation RBTabBar
- (void)test
{
        NSLog (@"这是一个类扩展方法");
}
@end

相关文章

网友评论

      本文标题:分类与类扩展(Category&Extension)

      本文链接:https://www.haomeiwen.com/subject/rqdzxqtx.html