美文网首页
iOS类别(Category)与扩展(Class Extensi

iOS类别(Category)与扩展(Class Extensi

作者: 路有点颠簸 | 来源:发表于2019-01-08 11:33 被阅读8次

1.类别(Category)

作用:

通过分类给某一个类扩充方法, 便于在企业级开发中多人同时维护同一个类,避免冲突。分类也分为声明和实现两个部分。

创建:

// 类别的声明
 @interface ClassName (CategoryName)
 NewMethod; //在类别中添加方法
 //不允许在类别中添加变量
 @end
 
 ClassName: 需要给哪个类扩充方法
 CategoryName: 分类的名称
 NewMethod: 扩充的方法
// 类别的实现
 @implementation ClassName(CategoryName)
 NewMethod
 ...
 @end
 
 ClassName: 需要给哪个类扩充方法
 CategoryName: 分类的名称
 NewMethod: 扩充的方法

注意:

1.分类是用于给原有类添加方法的, #它只能添加方法, 不能添加属性(成员变量)
2.分类中的@property, 只会生成setter/getter方法的声明, 不会生成实现以及私有的成员变量
3.可以在分类中访问原有类中.h中的属性
4.如果分类中有和原有类同名的方法, 会调用分类中的方法, 也就是说会忽略原有类的方法。同名方法调用的优先级为 分类 > 本类 > 父类。在开发中尽量不要覆盖原有类。
5.如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定;编译器会执行最后一个参与编译的分类中的方法。

通过runtime实现类别添加属性

Student类原有属性

@interface Student : NSObject
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *sex;
@end

添加属性address

#import "Student.h"
NS_ASSUME_NONNULL_BEGIN

@interface Student (address)
//@property (nonatomic,assign) NSInteger age;
@property (nonatomic,copy) NSString *address;
- (void)showNslog;
@end

NS_ASSUME_NONNULL_END
#import "Student+age.h"
#import <objc/runtime.h>

static NSString *key = @"key";

@implementation Student (address)
//关联对象替代setter方法
- (void)setAddress:(NSString *)address{
    objc_setAssociatedObject(self, &key, address, OBJC_ASSOCIATION_COPY);
}
//替代getter方法
- (NSString *)address{
    return objc_getAssociatedObject(self, &key);
}

- (void)showNslog{
    NSLog(@"测试一下");
}

@end

2.类扩展(Class Extension)

类扩展,即匿名分类,又称延展类别,开发当中我们几乎天天在使用。

Extension是Category的一个特例,可以为某个类扩充一些私有成员变量和方法。

做法:直接写在某个类的.m文件中

#import "Person.h"
//以下
@interface Person ()
{
    int _age;
}

- (void)say;

@end
//以上
@implementation Person

相关文章

网友评论

      本文标题:iOS类别(Category)与扩展(Class Extensi

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