如何在已有的category中添加属性

      在最近的一次面试中,遇到以上问题,在此做一下总结,也希望能为不明白的同学理清思路;

      OC没有纯粹的多继承特性,因此一般会通过类目和代理的方式来弥补,category使得新的类可以在原有的类基础上进行适当的扩展,但仅限于添加方法,不能直接添加属性(这一点不同于extension,extension可以添加属性和方法);今天要说明的便是如何通过运行时来向category中添加属性。

1.为什么要在category中添加属性?

      原有类的属性不够用,因此想在分类中添加属性。IOS中的一些系统API其实也有例子:比如UITableView中的section和row属性便是在NSIndexPath的分类中添加的;

2.如何添加属性?

手段:通过运行时的getAssociateObject( )和setAssociateObject( )方法重写存取方法

具体步骤:

(1)导入头文件

#import<objc/runtime.h>

(2)像往常一样添加属性:

A.在头文件中添加:

#import<UIkit/UIKit.h>
#import<UIFoundation/UIFoundation.h>

@interface Classname (Categoryname)

@property (nonatomic,copy) NSString *property;
@end

B.在匿名分类中添加:

@interface Classname () {
        NSString *property;
}
@end
备注:头文件中添加的属性在本类中可以使用,在类的实例中也可以使用;

                    匿名分类中添加的属性是私有属性,仅限于类中使用,在外面的类实例中无法使用;

(3)重写getter和setter方法:

     

#import "Classname + Categoryname.h"
#import <objc/runtime.h>

static void *strKey = &strKey;

@implementation Classname (Categoryname) 
-(void)setStr:(NSString *)str  
{  
    objc_setAssociatedObject(self, & strKey, str, OBJC_ASSOCIATION_COPY);  
}  

-(NSString *)str  
{  
    return objc_getAssociatedObject(self, &strKey);  
}
@end

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值