RunTime 给类添加属性
RunTime
网上有很多人都不知道Runtime到底是干嘛的?有很多博主都是长篇大论给他们讲这个讲那个,我感觉还不如实例来的实在。
很简单的一个例子:我们都知道会有这样的需求,未读消息列表的图片上要有一个红点。但是有的要黄点,有的要黑点,那你怎么写的呢?那你总不能一个一个的改吧,所以我们就可以用到Runtime.
1.首先建一个扩展类,给类添加一个颜色属性的Badge
#import <UIKit/UIKit.h>
@interface UIButton (MessageButton)
@property (nonatomic,strong) UIColor *badgeBGColor;
2. 然后 在 .m 文件里面 导入包
#import <objc/runtime.h>
3. 然后给这个属性 创建一个唯一的内存地址
static const char bageBGColorKey;
4.首先实现他的 set get 方法
-(void)setBadgeBGColor:(UIColor *)badgeBGColor
{
objc_setAssociatedObject(self, &bageBGColorKey, badgeBGColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(UIColor *)badgeBGColor {
return objc_getAssociatedObject(self, &bageBGColorKey);
}
5. 这里要说有一个点就是要用底层的api 开实现方法
objc_setAssociatedObject
objc_getAssociatedObject
这个其实就是前面加个objc 而已
6.然后再建一个 方法来实现他的 badge
-(void)framBGColor:(UIColor *)color
{
UIImageView *imageViewBgColor = [[UIImageView alloc]initWithFrame:CGRectMake(self.size.width-5, 0, 5, 5)];
imageViewBgColor.backgroundColor = color;
imageViewBgColor.layer.cornerRadius = 2.5f;
imageViewBgColor.layer.masksToBounds = YES;
[self addSubview:imageViewBgColor];
}
7. 再set方法里面调用这个方法
-(void)setBadgeBGColor:(UIColor *)badgeBGColor
{
objc_setAssociatedObject(self, &bageBGColorKey, badgeBGColor, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[self framBGColor:badgeBGColor];
}

8、其实有很多的方法都可以用到 比如button 要传多个属性的时候 也可以用的。可以添加很多属性和方法。
RunTime 给类添加属性的更多相关文章
- runTime动态给类添加属性
#项目中需要给系统类添加属性 #需要注意的地方就是.m中 set 和 get ,get方法中方法名和添加的属性名一致,set中可以用驼峰 #import <UIKit/UIKit.h> ...
- runtime-给系统已有类添加属性
在没有接触runtime之前,我们接触到的能给类进行扩展的方法有类目(category)和延展(extension)两种.类目(category)可以给系统已有类添加扩展方法但是不能添加属性,并且被添 ...
- Runtime获取类的属性列表和方法列表
Runtime获取类的属性列表和方法列表 Runtime很强大,他使得OC中没有真正意义上的私有属性和私有方法,我们可以利用OC的运行时拿到一个类的任何方法和任何属性,然后动态的去调用方法,objc_ ...
- python - 装饰器+描述符(给类添加属性且属性类型审核)
装饰器+描述符 实现给一个类添加属性且对添加的时,对属性进行类型审核: def zsq(**kwargs): def fun(obj): for i,j in kwargs.items(): seta ...
- Runtime 实现 动态添加属性
利用动态加载为对象添加一个 block 点击属性; .h 文件 #import <UIKit/UIKit.h> @interface UIView (Tap) /** * 动态添加手势 * ...
- JAVA“动态”为类添加属性
部分参考:http://www.cnblogs.com/zy2009/p/6725843.html pom.xml中添加: <dependency> <groupId>comm ...
- rails 给类添加属性
steven@ubuntu:~/RubymineProjects/OAONLINE$ rails generate migration AddPasswordToUsers password:stri ...
- 快速上手Runtime(二)之给分类添加属性
我们都知道,分类是不能直接添加属性的,那么我们有时候又需要实现这个功能,那么我们应该怎么办才能为分类添加上属性呢. Runtime给分类添加属性原理 给一个类声明属性,其实本质就是给这个类添加关联,并 ...
- ios开发runtime学习四:动态添加属性
#import "ViewController.h" #import "Person.h" #import "NSObject+Property.h& ...
随机推荐
- headfirst设计模式(2)—观察者模式
定义 观察者模式(有时又被称为发布(publish)-订阅(Subscribe)模式,在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知.这通常透过呼叫各观察 ...
- salesforce 零基础学习(六十六)VF页面应善于使用变量和函数(二)常用函数的使用
上一篇介绍VF中常用的变量,此篇主要内容为VF页面可以直接使用的函数,主要包括Date相关函数,Text相关函数,Information相关函数以及logic相关函数,其他相关函数,比如math相关函 ...
- beautifulsoup 获取a(tag)的属性href
一开始使用使用attrs(“href”) 出现错误TypeError: 'dict' object is not callable 由于attrs字典类型 atrrs["href" ...
- 一步一步在Windows中使用MyCat负载均衡 下篇
之前在 一步一步在Windows中使用MyCat负载均衡 上篇 中已经讲了如何配置出MyCat.下面讲其相关的使用. 五.配置MyCat-eye 对于MyCat监控官网还提供一个MyCat-eye w ...
- 4105: [Thu Summer Camp 2015]平方运算
首先嘛这道题目只要知道一个东西就很容易了:所有循环的最小公约数<=60,成一条链的长度最大为11,那么我们就可以用一个很裸的方法.对于在链上的数,我们修改直接暴力找出并修改.对于在环上的数,我们 ...
- [Usaco2014 Open Gold ]Cow Optics (树状数组+扫描线/函数式线段树)
这道题一上手就知道怎么做了= = 直接求出原光路和从目标点出发的光路,求这些光路的交点就行了 然后用树状数组+扫描线或函数式线段树就能过了= = 大量的离散+模拟+二分什么的特别恶心,考试的时候是想到 ...
- android学习5——画图问题
重写View中的onDraw函数可以实现画图.代码如下: @Override public void onDraw(Canvas canvas) { Paint paint = new Paint() ...
- Eclipse中debug调试java代码一直报Source not found的解决办法
今天使用eclipse的debug调试代码,一直没法正常调试,一按F6就提示Source not found 根据提示发现可能是另一个项目影响了,所以把另一个项目Close Project,这次直接t ...
- PCB行业版特色功能展示
普实PCB行业版,专为PCB行业需求而定制.秉承一体化.集团化.移动化为设计理念,采用互联网技术.云计算技术.移动应用技术开发的新一代系统帮助PCB企业创新管理模式.引领商业变革!系统从接到订单开始, ...
- 关于Storm Stream grouping
在Storm中, 开发者可以为上游spout/bolt发射出的tuples指定下游bolt的哪个/哪些task(s)来处理该tuples.这种指定在storm中叫做对stream的分组,即stream ...