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 给类添加属性的更多相关文章

  1. runTime动态给类添加属性

    #项目中需要给系统类添加属性 #需要注意的地方就是.m中   set 和 get  ,get方法中方法名和添加的属性名一致,set中可以用驼峰 #import <UIKit/UIKit.h> ...

  2. runtime-给系统已有类添加属性

    在没有接触runtime之前,我们接触到的能给类进行扩展的方法有类目(category)和延展(extension)两种.类目(category)可以给系统已有类添加扩展方法但是不能添加属性,并且被添 ...

  3. Runtime获取类的属性列表和方法列表

    Runtime获取类的属性列表和方法列表 Runtime很强大,他使得OC中没有真正意义上的私有属性和私有方法,我们可以利用OC的运行时拿到一个类的任何方法和任何属性,然后动态的去调用方法,objc_ ...

  4. python - 装饰器+描述符(给类添加属性且属性类型审核)

    装饰器+描述符 实现给一个类添加属性且对添加的时,对属性进行类型审核: def zsq(**kwargs): def fun(obj): for i,j in kwargs.items(): seta ...

  5. Runtime 实现 动态添加属性

    利用动态加载为对象添加一个 block 点击属性; .h 文件 #import <UIKit/UIKit.h> @interface UIView (Tap) /** * 动态添加手势 * ...

  6. JAVA“动态”为类添加属性

    部分参考:http://www.cnblogs.com/zy2009/p/6725843.html pom.xml中添加: <dependency> <groupId>comm ...

  7. rails 给类添加属性

    steven@ubuntu:~/RubymineProjects/OAONLINE$ rails generate migration AddPasswordToUsers password:stri ...

  8. 快速上手Runtime(二)之给分类添加属性

    我们都知道,分类是不能直接添加属性的,那么我们有时候又需要实现这个功能,那么我们应该怎么办才能为分类添加上属性呢. Runtime给分类添加属性原理 给一个类声明属性,其实本质就是给这个类添加关联,并 ...

  9. ios开发runtime学习四:动态添加属性

    #import "ViewController.h" #import "Person.h" #import "NSObject+Property.h& ...

随机推荐

  1. j2se 总结

    j2se在学习第二遍的时候,感觉还是比较亲切的.

  2. bootstrap 预定义样式风格

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 无分类编址 CIDR (构成超网)

    划分子网在一定程度上缓解了因特网在发展中遇 到的困难.然而在 1992 年因特网仍然面临三个必 须尽早解决的问题,这就是: B 类地址在 1992 年已分配了近一半,眼看就要在 1994 年 3 月全 ...

  4. [hadoop] - Container [xxxx] is running beyond physical/virtual memory limits.

    当运行mapreduce的时候,有时候会出现异常信息,提示物理内存或者虚拟内存超出限制,默认情况下:虚拟内存是物理内存的2.1倍.异常信息类似如下: Container [pid=13026,cont ...

  5. [多线程] Web 项目中,少有涉及到的一次多线程编程的经验

    如今框架横行,Spring 已经是非常成熟的容器体系,我们在日常开发 JavaWeb 的工作中,大多已经不需要考虑多线程的问题,这些问题都已经在Spring容器中实现,框架的意义就是让程序员们可以专注 ...

  6. SQL SERVER的统计信息

    1 什么是统计信息     统计信息 描述了 表格或者索引视图中的某些列的值 的分布情况,属于数据库对象.根据统计信息,查询优化器就能评估查询过程中需要读取的行数及结果集情况,同时也能创建高质量的查询 ...

  7. 了解 : EDM

    EDM是 Entity Data Meta,首先先了解什么是Entity. Entity 它是一个框架,在C#使用,方便调用SQL data的,和Odata 调用有关.细节我不清楚! EDM 基本是表 ...

  8. 每天一个Linux命令(11)--nl命令

    nl命令在Linux系统中用来计算文件中行号.nl可以将输出的文件内容自动的加上行号,其默认的结果与cat -n 有点不太一样,nl可以将行号做比较多的显示设计,包括位数与是否自动不起0等等的功能. ...

  9. Redis 安装与初体验

    一.Redis简介 Redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(s ...

  10. solr 学习之简介及安装

    一.solr简介 Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展,并对索 ...