如何为类别增加变量?

Category 是Objective-C 里面最常用到的功能之一。Category 可以为已经存在的类增加方法,而不需要增加一个子类。而且,我们可以在不知道某个类内部实现的情况下,为该类增加方法。

注意:类别并不能为类声明新的实例变量,他只包含方法。

此篇文章要通过类别为类增加变量,不多说了,直接上代码吧:

通过runtime实现如下代码:

static constchar *durationKey = "duration";

- (int)getDurationTime{

    return [objc_getAssociatedObject(self, &durationKey) intValue];

}

- (void)setDurationTime:(int)duration{

    objc_setAssociatedObject(self, &durationKey, [NSNumber numberWithInt:duration], OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}


调用方式: [selfgetDurationTime];


Category的真面目

objc所有类和对象都是c结构体,category当然也一样,下面是runtime中category的结构:

1
2
3
4
5
6
7
8
struct _category_t {
	const char *name; // 1
	struct _class_t *cls; // 2
	const struct _method_list_t *instance_methods; // 3
	const struct _method_list_t *class_methods; // 4
	const struct _protocol_list_t *protocols; // 5
	const struct _prop_list_t *properties; // 6
};

  1. name注意,并不是category小括号里写的名字,而是类的名字
  2. cls要扩展的类对象,编译期间这个值是不会有的,在app被runtime加载时才会根据name对应到类对象
  3. instance_methods这个category所有的-方法
  4. class_methods这个category所有的+方法
  5. protocols这个category实现的protocol,比较不常用在category里面实现协议,但是确实支持的
  6. properties这个category所有的property,这也是category里面可以定义属性的原因,不过这个property不会@synthesize实例变量,一般有需求添加实例变量属性时会采用objc_setAssociatedObjectobjc_getAssociatedObject方法绑定方法绑定,不过这种方法生成的与一个普通的实例变量完全是两码事。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值