本章接着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. python之路:进击的小白

    1.hello world print("hello world") 2.变量定义的规则 变量名只能是 字母.数字或下划线的任意组合 变量名的第一个字符不能是数字 以下关键字不能声 ...

  2. Django 之基础续

    1.路由系统之动态路由 前言:还记得之前的分页效果,这个如何实现呢?答案就是动态路由. url(r'^detail/(\d+)/$', views.detail), url(r'^detail2/(\ ...

  3. iOS 11 Xcode9开发 新特性学习 (新方法篇)

    1 .  引入github (1) 在Xcode 9 中,引入了 gitHub,新源代码管理导航器 可以展示branch分支和 tag标签. (2)点进去,就可以看指定一次commit了哪些东西 2 ...

  4. openGL学习进程(1)OpenGL的简介

        通过本节,我们来简要了解一下openGL.     (1)OpenGL概述: openGL(Open Graphics Library)是个专业的图形程序接口,定义了一个跨编程语言.跨平台的编 ...

  5. Linux sh远程连接失败 sshd.service启动失败

    今天不小心在本机的虚拟机执行了 chmod -R 777 /var 导致/var目录下所有权限全部是777 其中 /var/empty/sshd目录权限必须是744,却被改成了777,致使sh远程连接 ...

  6. Raspberry Pi开发之旅-土壤湿度检测

    一.土壤传感器 传感器四个针脚:  针脚 含义 AO 模拟信号输出 DO 数字信号输出 GND 电源负极 VCC 电源正极 二.接线 YL-38和YL69 之间直接用2根母对母线连接. YL-38和树 ...

  7. libhdfs的配置和使用

    测试环境:centos6.10,hadoop2.7.3,jdk1.8 测试代码:HDFSCSample.c #include "hdfs.h" #include <strin ...

  8. sed实例

    删除:d命令 $ sed '2d' example-----删除example文件的第二行. $ sed '2,$d' example-----删除example文件的第二行到末尾所有行. $ sed ...

  9. Nginx之Location模块

    location 的语法 locltion可以把不同方式的请求,定位到不同的处理方式上 location分类及用法 location大致分为三类: location = patt {} [精准匹配] ...

  10. Nginx配置指令的执行顺序

    rewrite阶段 rewrite阶段是一个比较早的请求处理阶段,这个阶段的配置指令一般用来对当前请求进行各种修改(比如对URI和URL参数进行改写),或者创建并初始化一系列后续处理阶段可能需要的Ng ...