分类(Category)

2021-08-17  本文已影响0人  学学学q

分类为什么只能添加方法,不能添加属性呢?

因为在分类中添加@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关联对象来实现

#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
上一篇下一篇

猜你喜欢

热点阅读