分類(Category)

分類為什么只能添加方法,不能添加屬性呢?

因?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_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
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容