// 1.分类是用于给原有类添加方法的, 它只能添加方法, 不能添加属性(成员变量)
@interface Person (NJ)
//{
// double _height;
//}
// 2.分类中的@property, 只会生成setter/getter方法的声明, 不会生成实现以及私有的成员变量
//@property (nonatomic, assign) double height;
- (void) hello;
/*
方法的调用顺序:
1.分类
2.本类
3.父类
*/
@end
// 3、如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定
// 会执行最后一个参与编译的分类中的方法
// 4、注意: 如果分类中有和原有类同名的方法, 会调用分类中的方法
// 也就是说会忽略原有类的方法
// 注意: 在开发中尽量不要这样写
在分类中的属性没有成员变量个getter、setter方法。
实现getter和setter方法;所以我们无法通过getter和setter方法操作color也不能直接访问_color
实现getter和setter方法,并且找到一个地址空间供我们访问
@interface Dog (ext)
@property (nonatomic, strong)UIColor *color;
@end
@implementation Dog (ext)
//这里用@selector(color)来用作 const void *key 的指针
- (UIColor *)color {
return objc_getAssociatedObject(self, _cmd);
}
- (void)setColor:(UIColor *)color {
objc_setAssociatedObject(self, @selector(color), color, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
属性 = 成员变量+getter、setter
在分类里使用@property声明属性后,又实现了setter和getter方法,那么在这个类以外可以正常通过点语法给该属性赋值和取值。就是说,在分类里使用@property声明属性,又实现了setter和getter方法后,可以认为给这个类添加上了属性
网友评论