谈谈Objective-C中分类和类扩展
2017-08-01 本文已影响41人
kamto
1.分类Category
- 给原有类添加方法,类别中的方法没被实现也不会有任何警告,因为类别是在运行时添加到类中。
原则不能添加属性或者成员变量,实际上可以通过runtime方式添加属性或者成员变量
- 分类中可以写@property, 但不会生成setter/getter方法, 也不会生成实现以及私有的成员变量(编译时会报警告)。
可以通过runtime手动添加setter/getter方法
- 分类中可以访问原有类.h中的属性
- 如果分类中有和原有类同名的方法,优先级是分类>原有类>原有类的父类
建立两个文件:Person+category.h和Person+category.m
#import "Person.h"
@interface Person (category)
@property (nonatomic, strong) NSString *name;
(void)categoryMethod;
@end
#import <objc/runtime.h>
@implementation Person (category)
(void)categoryMethod{
//code}
//通过runtime手动添加setter/getter方法
- (void)setName:(NSString *)name{
objc_setAssociatedObject(self, @selector(name), name, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)name{
return objc_getAssociatedObject(self, @selector(name));
}
注意:在原有类里使用下划线_访问分类中的属性是访问不到的,只能使用self访问
2.类扩展Extension
类扩展Extension与分类相比少了实现文件,我们称之为匿名分类
- 为原有类添加新的属性(成员变量)和方法
- 类扩展的私有方法必须实现,否则会发生警告,因为类扩展是在编译阶段被添加到类中
- 类扩展的私有方法在原有类的.m中实现
- 定义在 .m 文件中的类扩展方法为私有的,定义在 .h 文件中的类扩展方法为公有的
建立一个文件:Person_extension
#import "Person.h"
@interface Person ()
//私有属性
@property (nonatomic, strong) NSString *cardId;
//私有方法
- (void)extensionMethod;
@end
在Person.m中
实现类扩展的方法
-(void)extensionMethod{
//code
}
也可以这样创建一个Extension,在.m文件中
@interface Person ()
- (void)extensionMethod2;
@end
这也是一个类扩展
温故而知新,常常写下笔记也会有意想不到的作用。