您的位置:首页 > 移动开发 > IOS开发

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

2015-09-07 15:46 537 查看
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 const
void* defaultTextKey = &defaultTextKey;
@implementation UILabel (custom)
@dynamic defaultText;

//get方法
-(NSString*)defaultText
{
    return
objc_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(self, defaultTextKey, defaultText, OBJC_ASSOCIATION_RETAIN);
//set方法将声明的变量与程序段的指针连接起来

objc_getAssociatedObject(self, defaultTextKey);//get方法是从程序段取出指针并访问对象(内容)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS