分类(Category)

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

因为在分类中添加@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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容