注意
- 分类主要是给原类添加方法的,分类的结构指针中只有方法列表,没有属性列表。所以原则上分类里面最好不要声明属性
- 当然用@property可以声明属性 但是却不能生成成员变量和setter getter方法,所以如果要访问属性的话,最好通过原类的.h文件来访问。
- 在分类中如有有原类的方法,那么会优先执行分类里面的方法
- 我们会发现在分类中声明属性,只要不调用就不会报错,当然,我们也会发现报错的原因在于调用时没有生产setter和getter方法。由此可见分类并不是不可以进行属性声明,只要我们手动添加setter和getter方法就可以通过。
怎样手动生成setter getter方法?
- 分类.h文件
@property (strong, nonatomic) NSString *cheshiString;
- 分类.m文件
导入头文件
#import <objc/runtime.h>
定义常量
static char *cheshiName = "cheshiName";
实现setter getter方法
- (void)setCheshiString:(NSString *)cheshiString{
objc_setAssociatedObject(self, cheshiName, cheshiString, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
-(NSString *)cheshiString{
return objc_getAssociatedObject(self, cheshiName);
}
当然,最后我们会发现这个方法只能访问属性,仍然不能调用成员变量,所以开发中最好不要在分类里面添加属性。