iOS运行时场合一 category中添加(连接)对象(fake机制)

来源:互联网 发布:淘宝客服是怎么做的 编辑:程序博客网 时间:2024/05/21 22:55

1.原生category是不能添加属性的,如果需要添加的话可以使用运行时连接一个变量(是连接而不是添加).

2.例子 比方说给uilabel 添加一个nsstring属性 叫做defaultText,这样我们一个label 就有有两个text可用了,这里单纯为了说明给category连接属性,至于实用性大家自行开发。


.h文件中声明一个字符串变量

#import <UIKit/UIKit.h>

@interface UILabel (custom)

@property(nonatomic,strong)NSString* defaultText;

@end



.m文件中连接一个指针指向这个字符串并重写set和get方法


#import "UILabel+custom.h"

#import <objc/runtime.h>


static constvoid* defaultTextKey = &defaultTextKey;

@implementation UILabel (custom)

@dynamic defaultText;


//get方法

-(NSString*)defaultText

{

    returnobjc_getAssociatedObject(self,defaultTextKey);

}


//set方法

-(void)setDefaultText:(NSString *)defaultText

{

    objc_setAssociatedObject(self,defaultTextKey, defaultText, OBJC_ASSOCIATION_RETAIN);

//    [self setText:defaultText];

}


@end

这样在使用uilabel的时候就有两个属性可用了


个人理解:static const void* defaultTextKey = &defaultTextKey; 在程序数据段声明一个指针;

 objc_setAssociatedObject(selfdefaultTextKey, defaultText, OBJC_ASSOCIATION_RETAIN); //set方法将声明的变量与程序段的指针连接起来

objc_getAssociatedObject(selfdefaultTextKey);//get方法是从程序段取出指针并访问对象(内容)。




0 0
原创粉丝点击