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语言编写这个工具的时候,就比这个方便的多,只 ...
随机推荐
- wget: unable to resolve host address “http”
[root@one ~]# wget www.baidu.com --2017-09-24 10:20:23-- http://www.baidu.com/ Resolving http... fai ...
- Linux学习笔记(2)linux系统信息与进程相关命令
man 获得命令的帮助手册,如man cp:按q键退出 su 切换用户,如su - root; '-'表示改变用户的环境变量 who 显示系统中登录的用户 w 显示登录用户的详细信息 last 查看最 ...
- 请写一个python逻辑,计算一个文件中的大写字母数量
import os os.chdir(r'C:\Users\Administrator\Desktop')#os.chdir切换到指定目录 with open('a.txt') as today: c ...
- 【转】Python爬虫(3)_Beautifulsoup模块
一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...
- Java底层代码实现单文件读取和写入(解决中文乱码问题)
需求: 将"E:/data/车站一次/阿坝藏族羌族自治州.csv"文件中的内容读取,写入到"E:/data//车站一次.csv". 代码: public cla ...
- json教程系列(4)-optXXX方法的使用
在JSONObject获取value有多种方法,如果key不存在的话,这些方法无一例外的都会抛出异常.如果在线环境抛出异常,就会使出现error页面,影响用户体验,针对这种情况最好是使用optXXX方 ...
- SOA、SOAP、REST、RPC
1.SOA SOA(面向服务的软件架构.Service Oriented Architecture),是一种软件设计模式,主要应用于不同应用组件之间通过某种协议来互操作.例如典型的 通信网络协议.因 ...
- tomcat8配置tomcat-users.xml不生效
一般想进入tomcat管理后台,只要在tomcat-users.xml配置文件中添加一下内容即可 <role rolename="manager-gui"/> < ...
- nodejs/REPL环境命令行操作命令
1,输入node 进入node[REPL]环境 2,按两次[ctrl+c]退出node[REPL]环境 3,上箭头会查找上次输入的命令 4,cls清屏 5,tab键会自动补全路径 6,REPL环境
- INSPIRED启示录 读书笔记 - 第21章 产品验证
证明产品的价值.可用性.可行性 产品验证是指在正式开发.部署产品前,验证产品说明文档描述的产品是否符合预期要求 产品经理向产品团队提供最终的产品说明文档前,需要进行三项重要验证 1.可行性测试:明确在 ...