分类为什么只能添加方法,不能添加属性呢?
因为在分类中添加@property添加属性的时候,没有生成带下划线的成员变量以及setter和getter方法实现。
分类的结构
// 没有成员变量列表
struct _category_t {
const char *name;
struct _class_t *cls;
const struct _method_list_t *instance_methods; // 对象方法列表
const struct _method_list_t *class_methods; // 类方法列表
const struct _protocol_list_t *protocols; // 协议列表
const struct _prop_list_t *properties; // 属性列表
};
怎么给分类添加属性呢?
我们可以手动实现setter和getter方法,但是无法使用访问以"_"开头的成员变量,这时候我们可以通过runtime来实现。
#import "UIView+Frame.h"
@implementation UIView (Frame)
- (void)setX:(CGFloat)x {
_x = x;
}
- (CGFloat)x {
return _x;
}
@end
上面代码提示Use of undeclared identifier '_x'
,那么我们可以通过runtime
关联对象来实现
objc_setAssociatedObject
objc_getAssociatedObject
#import "UIView+Frame.h"
#import <objc/runtime.h>
@implementation UIView (Frame)
- (void)setX:(CGFloat)x {
return objc_setAssociatedObject(self, @"x", @(x), OBJC_ASSOCIATION_ASSIGN);
}
- (CGFloat)x {
return [objc_getAssociatedObject(self, @"x") floatValue];
}
@end
网友评论