本章接着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解读 (二)的更多相关文章

  1. NSObject头文件解析 / 消息机制 / Runtime解读 (一)

    NSObject头文件解析 当我们需要自定义类都会创建一个NSObject子类, 比如: #import <Foundation/Foundation.h> @interface Clas ...

  2. Spring的配置文件ApplicationContext.xml配置头文件解析

    Spring的配置文件ApplicationContext.xml配置头文件解析 原创 2016年12月16日 14:22:43 标签: spring配置文件 5446 spring中的applica ...

  3. 探索C++头文件解析方法

    最近一直在搞基于SWIG的C++接口翻译Java代码的工作.SWIG内部基于Bison(Yacc)的C/C++解析器,最近纠结于SWIG不能解析C++构造函数中的默认初始化赋值操作,想找一个能够补充此 ...

  4. MSP430G2553头文件解析

    MSP430寄存器中文注释---P1/2口(带中断功能)       /************************************************************     ...

  5. Unix网络编程 — 头文件解析

    1.1. < sys/types.h > primitive system data types(包含很多类型重定义,如pid_t.int8_t等) 1.2. < sys/socke ...

  6. TC297B - 外设头文件解析(以IO为例)

    打开例程,目录树下的Includes中包含了各个片上资源对应的头文件,这些头文件定义了相应外设的寄存器地址(寄存器是内置于各个 IP 外设中,是一种用于配置外设功能的存储器,就是一种内存,并且有相对应 ...

  7. 【原创】源码角度分析Android的消息机制系列(二)——ThreadLocal的工作过程

    ι 版权声明:本文为博主原创文章,未经博主允许不得转载. 在上一篇文章中,我们已经提到了ThreadLocal,它并非线程,而是在线程中存储数据用的.数据存储以后,只能在指定的线程中获取到数据,对于其 ...

  8. 带BOM头文件解析

    在java中apache提供了一个工具类BOMStream,在获取文件流时,将获取到的文件流转化成为BOM流: InputStreamReader is = new InputStreamReader ...

  9. PE文件解析器的编写(二)——PE文件头的解析

    之前在学习PE文件格式的时候,是通过自己查看各个结构,自己一步步计算各个成员在结构中的偏移,然后在计算出其在文件中的偏移,从而找到各个结构的值,但是在使用C语言编写这个工具的时候,就比这个方便的多,只 ...

随机推荐

  1. 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 ...

  2. Linux学习笔记(2)linux系统信息与进程相关命令

    man 获得命令的帮助手册,如man cp:按q键退出 su 切换用户,如su - root; '-'表示改变用户的环境变量 who 显示系统中登录的用户 w 显示登录用户的详细信息 last 查看最 ...

  3. 请写一个python逻辑,计算一个文件中的大写字母数量

    import os os.chdir(r'C:\Users\Administrator\Desktop')#os.chdir切换到指定目录 with open('a.txt') as today: c ...

  4. 【转】Python爬虫(3)_Beautifulsoup模块

    一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你 ...

  5. Java底层代码实现单文件读取和写入(解决中文乱码问题)

    需求: 将"E:/data/车站一次/阿坝藏族羌族自治州.csv"文件中的内容读取,写入到"E:/data//车站一次.csv". 代码: public cla ...

  6. json教程系列(4)-optXXX方法的使用

    在JSONObject获取value有多种方法,如果key不存在的话,这些方法无一例外的都会抛出异常.如果在线环境抛出异常,就会使出现error页面,影响用户体验,针对这种情况最好是使用optXXX方 ...

  7. SOA、SOAP、REST、RPC

    1.SOA SOA(面向服务的软件架构.Service Oriented Architecture),是一种软件设计模式,主要应用于不同应用组件之间通过某种协议来互操作.例如典型的  通信网络协议.因 ...

  8. tomcat8配置tomcat-users.xml不生效

    一般想进入tomcat管理后台,只要在tomcat-users.xml配置文件中添加一下内容即可 <role rolename="manager-gui"/> < ...

  9. nodejs/REPL环境命令行操作命令

    1,输入node 进入node[REPL]环境 2,按两次[ctrl+c]退出node[REPL]环境 3,上箭头会查找上次输入的命令 4,cls清屏 5,tab键会自动补全路径 6,REPL环境

  10. INSPIRED启示录 读书笔记 - 第21章 产品验证

    证明产品的价值.可用性.可行性 产品验证是指在正式开发.部署产品前,验证产品说明文档描述的产品是否符合预期要求 产品经理向产品团队提供最终的产品说明文档前,需要进行三项重要验证 1.可行性测试:明确在 ...