美文网首页
分类(Category)

分类(Category)

作者: 学学学q | 来源:发表于2021-08-17 11:18 被阅读0次

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

    因为在分类中添加@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
    

    相关文章

      网友评论

          本文标题:分类(Category)

          本文链接:https://www.haomeiwen.com/subject/wcvbvltx.html