起因


抽风查看以前的代码!!查看一个红点的库!查着查着就想补充一下分类里添加属性的方法!!重温runtime的一些使用! category里面的分类属性是不带 setter/getter ,而普通类里面是已经带 setter/getter;

动态添加属性

写法1
@property (nonatomic, assign) BOOL isNotIgnore;

//runtime 动态绑定 属性
- (BOOL)isNotIgnore{
    //_cmd == @select(isIgnore); 和set方法里一致
    return [objc_getAssociatedObject(self, _cmd) boolValue];
}

- (void)setIsNotIgnore:(BOOL)isNotIgnore{
    // 注意BOOL类型 需要用OBJC_ASSOCIATION_RETAIN_NONATOMIC 不要用错,否则set方法会赋值出错
    objc_setAssociatedObject(self, @selector(isNotIgnore), @(isNotIgnore), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
写法2
static char badgeMaximumBadgeNumberKey;

@property (nonatomic, assign) NSInteger badgeMaximumBadgeNumber;

//runtime 动态绑定 属性
- (NSInteger)badgeMaximumBadgeNumber {
    id obj = objc_getAssociatedObject(self, &badgeMaximumBadgeNumberKey);
    if(obj != nil && [obj isKindOfClass:[NSNumber class]])
    {
        return [obj integerValue];
    }
    else
        return kWZLBadgeDefaultMaximumBadgeNumber;
}

- (void)setBadgeMaximumBadgeNumber:(NSInteger)badgeMaximumBadgeNumber {
    NSNumber *numObj = @(badgeMaximumBadgeNumber);
    objc_setAssociatedObject(self, &badgeMaximumBadgeNumberKey, numObj, OBJC_ASSOCIATION_RETAIN);
}

参考代码

红点提醒代码

整合demo

中国版github