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
网友评论