NSObject头文件解析 / 消息机制 / Runtime解读 (二)
本章接着NSObject头文件解析 / 消息机制 / Runtime解读(一)写
给类添加属性:
BOOL class_addProperty(Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount)
其中有一个参数我们再在上一篇中提到过
typedef struct {
const char *name; /**< The name of the attribute */
const char *value; /**< The value of the attribute (usually empty) */
} objc_property_attribute_t;
我们看下常见的赋值
| 常用attribute | name | value |
| nonatomic | "N" | "" |
| strong/retain | "&" | "" |
| weak | "W" | "" |
| 属性的类型type | "T" | "@TypeName", eg"@\"NSString\"" |
| 属性对应的实例变量Ivar | "V" | "Ivar_name", eg "_name" |
| readonly | "R" | "" |
| getter | "G" | "GetterName", eg"isRight" |
| setter | "S" | "SetterName", eg"setName" |
| assign/atomic | 默认即为assign和retain |
例子:
- (void)viewDidLoad {
[super viewDidLoad];
//创建一个对象
ClassA *aClass = [ClassA new];
//创建一个attributes
objc_property_attribute_t nonatmoic = {"N", ""};
objc_property_attribute_t strong = {"&", ""};
objc_property_attribute_t type = {"T", "@\"NSString\""};
objc_property_attribute_t ivar = {"V", "_name"};
objc_property_attribute_t attributes[] = {nonatmoic, strong, type, ivar, getter, setter};
//给对象类添加属性
BOOL result = class_addProperty([aClass class], "name", attributes, 4);
if (result) {
NSLog(@"添加成功");
} else {
NSLog(@"添加失败");
}
//读取添加属性
objc_property_t property = class_getProperty([aClass class], "name");
//获取添加的属性的名称
NSString *propertyName = [NSString stringWithUTF8String:property_getName(property)];
//打印获取到的属性名
NSLog(@"获取到的属性名为: %@", propertyName);
}
运行结果:
-- ::01.949 RunTimeDemo[:] 添加成功
-- ::01.949 RunTimeDemo[:] 获取到的属性名为: name
替换属性:
void class_replaceProperty(Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount)
例子:
//创建一个对象
ClassA *aClass = [ClassA new]; //创建一个attributes
objc_property_attribute_t nonatmoic = {"N", ""};
objc_property_attribute_t strong = {"&", ""};
objc_property_attribute_t type = {"T", "@\"NSString\""};
objc_property_attribute_t ivar = {"V", "_name"}; objc_property_attribute_t attributes[] = {nonatmoic, strong, type, ivar}; //替换属性
class_replaceProperty([aClass class], "name", attributes, );
运行时创建新类:
Class objc_allocateClassPair(Class superclass, const char *name,
size_t extraBytes)
注册创建的新类:
void objc_registerClassPair(Class cls)
例子:
void printA(){
NSLog(@"Print A");
}
- (void)viewDidLoad {
[super viewDidLoad];
//创新新类
Class NewClass = objc_allocateClassPair([NSObject class], "NewObject", );
//注册类
objc_registerClassPair(NewClass);
//给类添加方法
class_addMethod([NewClass class], @selector(printA), (IMP)printA, "v@:");
//创建实例
id ob = [NewClass new];
//实例执行方法
[ob printA];
}
运行结果:
-- ::34.091 RunTimeDemo[:] Print A
先Mark在这里, 后面会继续更新
NSObject头文件解析 / 消息机制 / Runtime解读 (二)的更多相关文章
- NSObject头文件解析 / 消息机制 / Runtime解读 (一)
NSObject头文件解析 当我们需要自定义类都会创建一个NSObject子类, 比如: #import <Foundation/Foundation.h> @interface Clas ...
- Spring的配置文件ApplicationContext.xml配置头文件解析
Spring的配置文件ApplicationContext.xml配置头文件解析 原创 2016年12月16日 14:22:43 标签: spring配置文件 5446 spring中的applica ...
- 探索C++头文件解析方法
最近一直在搞基于SWIG的C++接口翻译Java代码的工作.SWIG内部基于Bison(Yacc)的C/C++解析器,最近纠结于SWIG不能解析C++构造函数中的默认初始化赋值操作,想找一个能够补充此 ...
- MSP430G2553头文件解析
MSP430寄存器中文注释---P1/2口(带中断功能) /************************************************************ ...
- Unix网络编程 — 头文件解析
1.1. < sys/types.h > primitive system data types(包含很多类型重定义,如pid_t.int8_t等) 1.2. < sys/socke ...
- TC297B - 外设头文件解析(以IO为例)
打开例程,目录树下的Includes中包含了各个片上资源对应的头文件,这些头文件定义了相应外设的寄存器地址(寄存器是内置于各个 IP 外设中,是一种用于配置外设功能的存储器,就是一种内存,并且有相对应 ...
- 【原创】源码角度分析Android的消息机制系列(二)——ThreadLocal的工作过程
ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 在上一篇文章中,我们已经提到了ThreadLocal,它并非线程,而是在线程中存储数据用的.数据存储以后,只能在指定的线程中获取到数据,对于其 ...
- 带BOM头文件解析
在java中apache提供了一个工具类BOMStream,在获取文件流时,将获取到的文件流转化成为BOM流: InputStreamReader is = new InputStreamReader ...
- PE文件解析器的编写(二)——PE文件头的解析
之前在学习PE文件格式的时候,是通过自己查看各个结构,自己一步步计算各个成员在结构中的偏移,然后在计算出其在文件中的偏移,从而找到各个结构的值,但是在使用C语言编写这个工具的时候,就比这个方便的多,只 ...
随机推荐
- python面试题(三)
1 一行代码实现9*9乘法表 print ("\n".join("\t".join(["%s*%s=%s" %(x,y,x*y) for y ...
- php 使用sendmail发送邮件
php 使用sendmail发送邮件 1.配置php.ini SMTP=smtp.163.com sendmail_from = 17760273453@163.com sendmail_path = ...
- [转载]mvc:view-controller
1.重定向 ? 1 <mvc:view-controller path="/" view-name="redirect:/admin/index"/> ...
- 003 F-47创建预付定金请求检查增强-20150819.docx
Enhancement SE38:LEINRF26 操作F-47,预付定金请求回车时,检查输入的采购订单项目发票视图,预付定金% 栏位,若为空,则报错,不为空可继续. 检查逻辑:检查采购凭证项 ...
- google guava libraries
google/guava Guava项目包含一些在我们自己的项目中可以依赖的Google核心库.也就是Google开源的核心库,可以由其他项目利用. 其中包括: 集合 缓存 原语的支持(primiti ...
- UNIX 系统常用管理命令
一. 引言 UNIX系统作为一种强大的多用户分时操作系统,在越来越多的场合受到了应用,同时,对UNIX的系统管理的要求也随之越来越多,但目前的书籍对UNIX系统管理命令介绍的并不是很多.本文主要是针对 ...
- MODBUS协议 一种问答方式的通信协议
源:MODBUS协议 一种问答方式的通信协议 ModBus通信系统协议
- Docker容器技术-在开发中引用Docker
明确一点: 容器不适合构建那种发布周期以周或月为单位的大型单一架构企业软件,容器适合采用微服务的方式,以及探索诸如持续部署这样的技术,使得我们能安全地在一天内多次更新生产环境. 一.在开发中引用Doc ...
- Nginx之Location模块
location 的语法 locltion可以把不同方式的请求,定位到不同的处理方式上 location分类及用法 location大致分为三类: location = patt {} [精准匹配] ...
- JVM原理(Java代码编译和执行的整个过程+JVM内存管理及垃圾回收机制)
转载注明出处: http://blog.csdn.net/cutesource/article/details/5904501 JVM工作原理和特点主要是指操作系统装入JVM是通过jdk中Java.e ...