IOS Object-C 中Runtime详解及实例代码

iOS Object-C 中Runtime详解及实例代码

1. Runtime简介

Runtime是OC的运行时系统。是一个由 C 语言编写的 底层的 Objective-C 对象(如实例和 Class)的管理系统。它是编译器和 CPU 的桥梁, Objective-C 的“动态”本质得以实现。

通过运行时机制,Objective-C能够实现动态绑定和方法调用、动态的添加或替换方法实现、实现类和对象的创建和销毁、属性的实现等。在 Objective-C 中,当我们调用一个方法时,是通过消息传递机制来实现的。我们在代码中调用方法,并不是直接调用方法的实现,而是向对象发送一条消息,由对象根据消息找到对应的方法实现并执行。

Objective-C runtime 是开源的,我们可以通过下载源代码学习其中的细节并进行修改。

2. Runtime常用方法

2.1 获取类名

// 获取类名
const char * class_getName(Class cls)

2.2 获取类的父类

// 获取类的父类
Class class_getSuperclass(Class cls);

2.3 获取类的实例变量

// 获取类的实例变量
Ivar class_getInstanceVariable(Class cls, const char *name)

2.4 获取类的属性

// 获取类的属性
objc_property_t class_getProperty(Class cls, const char *name)

2.5 获取类的方法

// 获取类的方法
Method class_getInstanceMethod(Class cls, SEL name)

2.6 获取类实例变量的值

// 获取类实例变量的值
id object_getIvar(id obj, Ivar ivar)

2.7 设置类实例变量的值

// 设置类实例变量的值
void object_setIvar(id obj, Ivar ivar, id value)

2.8 动态创建类

// 动态创建类
Class objc_allocateClassPair(Class superclass, const char *name, size_t extraBytes)

2.9 动态添加方法

// 动态添加方法
BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types)

2.10 动态添加属性

// 动态添加属性
BOOL class_addProperty(Class cls, const char *name, const objc_property_attribute_t *attributes, unsigned int attributeCount)

3. 实例说明

3.1 获取类名

- (NSString *)getClassname:(id)object{
    const char *classname = class_getName([object class]);
    return [NSString stringWithUTF8String:classname];
}

3.2 动态添加属性

- (void)addPropertyForClass:(Class)cls {
    // 添加新属性
    objc_property_attribute_t type = {"T","@\"NSString\""}; // 类型是NSString
    objc_property_attribute_t ownership = { "C", "" }; // C = copy
    objc_property_attribute_t backingivar  = { "V", "_dynamicProperty" };  //属性名,记得带下划线
    objc_property_attribute_t attrs[] = { type, ownership, backingivar };
    class_addProperty(cls, "dynamicProperty", attrs, 3);
}

以上是本文档的简要介绍,关于Runtime的详细使用和示例代码可阅读下列文章:

Runtime基础知识与Demo

深入理解Objective-C:Runtime

Objective-C Runtime Programming Guide

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:IOS Object-C 中Runtime详解及实例代码 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C/C++ 浅拷贝和深拷贝的实例详解

    针对题目“C/C++ 浅拷贝和深拷贝的实例详解”,我将为您提供一份完整的攻略。 什么是拷贝 在程序设计中,我们经常使用拷贝操作,将一个对象的内容复制到另一个对象中。在C/C++中,拷贝操作可以是浅拷贝或深拷贝,两者的区别在于拷贝时是否复制该对象所指向的堆内存。 浅拷贝 浅拷贝(Shallow Copy)是指拷贝一个对象时,只复制其值及其指针,而不会复制指针所…

    C 2023年5月23日
    00
  • OpenCV实现图像连通域

    下面是OpenCV实现图像连通域的完整攻略: 1. 简介 图像连通域是指一组具有相同像素值的像素的集合。在图像分割、形状识别等领域中,这是一个非常重要的概念。OpenCV提供了一些方法来计算图像中不同的连通域。在这篇文章中,我将向你展示如何用OpenCV实现图像连通域。 2. 实现步骤 OpenCV通过扫描整个图像,检测相邻像素值相同的像素,将这些像素标记为…

    C 2023年5月23日
    00
  • c++中try catch的用法小结

    当在C++代码中使用异常处理时,我们必须使用“try-catch”块来捕捉和处理异常。下面是一些关于“C++中try catch的用法小结”的攻略: 一、try-catch块的基本用法 使用try-catch块来捕捉异常,代码块包围了可能引发异常的代码。 try { //可能引发异常的代码 } catch(ExceptionType name) { //处理…

    C 2023年5月22日
    00
  • python math模块使用方法介绍

    Python math模块使用方法介绍 Python的math模块是一个十分强大的数学库,提供许多数学函数和常数。下面将对math模块的使用方法进行详细介绍。 导入math模块 使用math模块前,需要先导入该模块。可以使用以下方式进行导入: import math 常用的math函数 math模块提供了许多数学函数,这里列举一些常用的函数: math.ce…

    C 2023年5月22日
    00
  • C指针原理教程之C快速入门

    “C指针原理教程之C快速入门”是一篇讲解C语言指针的指南,它详细地介绍了C指针的概念、基础与进阶知识,适用于所有初学者或需要加深自己基础知识的人。下面将为你详细讲解这篇攻略。 C指针原理教程之C快速入门:介绍指针 本节主要介绍指针的概念和基础知识,包括定义指针、指针的运算等。同时,本节也将介绍指针的应用,例如数组、函数调用等。 C指针原理教程之C快速入门:指…

    C 2023年5月22日
    00
  • Go JSON编码与解码的实现

    Go JSON编码与解码的实现 在Go语言中,JSON编码与解码非常常见,Golang标准库提供了encoding/json包来支持JSON格式数据的序列化和反序列化。接下来将详细讲解如何使用encoding/json包进行JSON编码与解码。 JSON编码 JSON编码,指将Go语言中的结构体等数据类型转换成JSON格式的字符串。在Go语言中,使用json…

    C 2023年5月23日
    00
  • C/C++语言printf命令使用方法

    C/C++语言printf命令使用方法 一、printf命令的作用 printf命令是C语言和C++语言中的一个常用的输出函数,用于将指定的文字、字符、数字等信息输出到屏幕上。其语法为: printf("格式化字符串", 输出参数); 其中,格式化字符串是一个包含格式控制字符和普通字符的字符串,控制字符串中使用%占位符表示需要输出的变量的…

    C 2023年5月23日
    00
  • IE浏览器无法打开搜索页的详细解决方法以及常用文件打不开的解决方法

    问题描述: 有时我们会遇到在IE浏览器中无法打开搜索页或者常用的文件打不开的问题,造成这个问题通常有以下几个原因: IE浏览器设置问题; 操作系统缺少必要的组件或者文件关联出现问题; 系统文件被病毒或者恶意软件感染导致异常等问题。 解决方法: 解决IE浏览器无法打开搜索页的方法 步骤一:清空IE浏览器缓存和Cookie 在IE浏览器中点击菜单栏的“工具”按钮…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部