分類為什么只能添加方法,不能添加屬性呢?
因?yàn)樵诜诸愔刑砑覢property添加屬性的時候,沒有生成帶下劃線的成員變量以及setter和getter方法實(shí)現(xiàn)。
分類的結(jié)構(gòu)
// 沒有成員變量列表
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; // 協(xié)議列表
const struct _prop_list_t *properties; // 屬性列表
};
怎么給分類添加屬性呢?
我們可以手動實(shí)現(xiàn)setter和getter方法,但是無法使用訪問以"_"開頭的成員變量,這時候我們可以通過runtime來實(shí)現(xiàn)。
#import "UIView+Frame.h"
@implementation UIView (Frame)
- (void)setX:(CGFloat)x {
_x = x;
}
- (CGFloat)x {
return _x;
}
@end
上面代碼提示Use of undeclared identifier '_x',那么我們可以通過runtime關(guān)聯(lián)對象來實(shí)現(xiàn)
objc_setAssociatedObjectobjc_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