IOS 中runtime使用方法整理

发布时间 - 2026-01-11 00:26:26    点击率:

IOS 中runtime使用方法整理

做iOS的朋友都知道或听说runtime,这个东西很像java的反射机制,但功能远胜于java的反射。通过runtime我们可以动态的向一个类中添加属性、成员变量、方法,以及对其进行读写访问。

新建两个类ClassOne和ClassTwo

#import <Foundation/Foundation.h>

@interface ClassOne : NSObject{
  NSString *_publicVar1;
  NSString *_publicVar2;
}

@property(nonatomic,copy) NSString *publicProperty1;
@property(nonatomic,copy) NSString *publicProperty2;

- (void) testClassOneWithArg1:(NSString *)arg1;
@end


#import "ClassOne.h"

@interface ClassOne()
@property(nonatomic,copy) NSString *privateProperty1;
@property(nonatomic,copy) NSString *privateProperty2;

@end

@implementation ClassOne{
    NSString *_privateVar1;
    NSString *_privateVar2;
}

- (void)testClassOneWithArg1:(NSString *)arg1{
  NSLog(@"this is CalssOne, arg1:%@",arg1);
}

- (void)testClassOneWithArg1:(NSString *)arg1 arg2:arg2{
  NSLog(@"this is CalssOne, arg1:%@ arg2:%@",arg1,arg2);
}
@end

#import <Foundation/Foundation.h>

@interface ClassTwo : NSObject
- (void) testClassTwoWithArg1:(NSString *)arg1 arg2:(NSString *)arg2;
@end


#import "ClassTwo.h"

@implementation ClassTwo
- (void)testClassTwoWithArg1:(NSString *)arg1 arg2:(NSString *)arg2{
  NSLog(@"this is ClassTwo arg1:%@,arg2:%@",arg1,arg2);
}
@end

1.拷贝对象

ClassOne *one = [ClassOne new];
id onec1 = object_copy(one,sizeof(one));

2.给类添加方法

ClassOne *one = [ClassOne new];
class_addMethod([ClassOne class], @selector(testClassOneWithArg1:arg2:arg3:), (IMP)testClassOne , "i@:@@@");
[one testClassOneWithArg1:@"arg1" arg2:@"arg2" arg3:@"arg3"];

//方法对应的C函数
int testClassOne(id self,SEL _cmd, NSString *arg1,NSString *arg2,NSString *arg3){
NSLog(@"this is a test function add to ClassOne as a methad with arg1:%@ arg2:%@ and arg3:%@",arg1,arg2,arg3);
  return 10;
}

3.添加属性(方式一)

//属性类型
objc_property_attribute_t type = { "T", "@\"NSString\"" };
//访问类型
objc_property_attribute_t ownership = { "C", "" };
//对应成员变量名称
objc_property_attribute_t backingivar = { "V", "_testPropertyName" };
objc_property_attribute_t attrs[] = { type, ownership, backingivar };
class_addProperty([ClassOne class], "testPropertyName", attrs, 3);
class_addMethod([ClassOne class], @selector(testPropertyName), (IMP)testPropertyNameGetter , "@:@@");
class_addMethod([ClassOne class], @selector(setTestPropertyName:), (IMP)testPropertyNameSetter, "v:@@@");


//属性对应的Getter方法
NSString* testPropertyNameGetter(id self,SEL _cmd){
  Ivar ivar = class_getInstanceVariable([ClassOne class], "_testPropertyName");
  return object_getIvar(self, ivar);
}

//属性对应的Setter方法
void testPropertyNameSetter(id self,SEL _cmd,NSString *testPropertyNameValue){
  Ivar ivar = class_getInstanceVariable([ClassOne class], "_testPropertyName");
  object_setIvar(self, ivar, testPropertyNameValue);
}

4.添加属性(方式2)

ClassOne *one = [ClassOne new];
objc_setAssociatedObject(one, "objTag", @"value", OBJC_ASSOCIATION_COPY);
NSString *value = objc_getAssociatedObject(one, "objTag");
NSLog(@"通过Associate设置:%@",value);

5.获取类的名称

ClassOne *one = [ClassOne new];
const char *className = object_getClassName(one);
NSLog(@"className:%@",[NSString stringWithUTF8String:className]);

6.获取一个类的所有方法

UInt count;
Method *methods = class_copyMethodList([ClassOne class], &count);
for (int i = 0; i < count; i++) {
  Method method = methods[i];
  SEL sel = method_getName(method);
  NSLog(@"方法名:%@",NSStringFromSelector(sel));
}

7.获取一个类的所有属性

uint propertyCount;
objc_property_t *ps = class_copyPropertyList([ClassOne class], &propertyCount);
for (uint i = 0; i < propertyCount; i++) {
  objc_property_t property = ps[i];
  const char *propertyName = property_getName(property);
  const char *propertyAttributes = property_getAttributes(property);
  NSLog(@"propertyName:%@",[NSString stringWithUTF8String:propertyName]);
  NSLog(@"propertyAttributes:%@",[NSString stringWithUTF8String:propertyAttributes]);
}

8.获取类的所有成员变量

uint ivarCount;
Ivar *ivars = class_copyIvarList([ClassOne class], &ivarCount);
for (uint i = 0; i < ivarCount; i++) {
  Ivar ivar = ivars[i];
  const char *ivarName = ivar_getName(ivar);
  NSLog(@"ivarName:%@",[NSString stringWithUTF8String:ivarName]);
}

9.获得成员变量类型

uint ivarCount;
Ivar *ivars = class_copyIvarList([ClassOne class], &ivarCount);
for (uint i = 0; i < ivarCount; i++) {
  Ivar ivar = ivars[i];
  const char *ivarName = ivar_getName(ivar);
  const char *type = ivar_getTypeEncoding(ivar);
  NSLog(@"ivarName=%@,type=%@",[NSString stringWithUTF8String:ivarName],[NSString stringWithUTF8String:type]);
}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# iOS中runtime的使用总结  # iOS  # runtime使用方法  # 总结iOS中runtime的使用  # iOS runtime forwardInvocation详解及整理  # iOS使用runtime修改文本框(TextField)的占位文字颜色  # iOS runtime动态添加方法示例详解  # iOS通过Runtime实现友盟统计的实例代码  # IOS Object-C 中Runtime详解及实例代码  # iOS利用Runtime实现友盟页面数据统计的功能示例  # iOS runtime知识梳理  # iOS中Runtime的几种基本用法记录  # iOS Runtime详解(新手也看得懂)  # 我们可以  # 对其  # 希望能  # 谢谢大家  # 很像  # 类中  # 远胜于  # id  # sizeof  # object_copy  # implementation  # CalssOne  # NSLog  # test  # _cmd  # SEL  # function  # return  # methad  # add 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Angular 表单中正确绑定输入值以确保提交与验证正常工作  Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】  如何在万网开始建站?分步指南解析  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Laravel如何处理异常和错误?(Handler示例)  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  宙斯浏览器文件分类查看教程 快速筛选视频文档与图片方法  如何快速生成专业多端适配建站电话?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  如何用花生壳三步快速搭建专属网站?  Python制作简易注册登录系统  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  微信小程序 五星评分(包括半颗星评分)实例代码  怎样使用JSON进行数据交换_它有什么限制  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  南京网站制作费用,南京远驱官方网站?  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  JS实现鼠标移上去显示图片或微信二维码  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  网站建设保证美观性,需要考虑的几点问题!  Linux系统运维自动化项目教程_Ansible批量管理实战  如何快速生成ASP一键建站模板并优化安全性?  中山网站推广排名,中山信息港登录入口?  如何在Tomcat中配置并部署网站项目?  php 三元运算符实例详细介绍  如何用VPS主机快速搭建个人网站?  浅谈Javascript中的Label语句  如何快速搭建高效简练网站?  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  Python文件流缓冲机制_IO性能解析【教程】  如何在宝塔面板中创建新站点?  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  实例解析angularjs的filter过滤器  如何在万网自助建站中设置域名及备案?  在线制作视频的网站有哪些,电脑如何制作视频短片?  如何在建站主机中优化服务器配置?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何在腾讯云免费申请建站?  如何在Windows环境下新建FTP站点并设置权限?  如何用美橙互联一键搭建多站合一网站?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  北京网站制作的公司有哪些,北京白云观官方网站?  Python图片处理进阶教程_Pillow滤镜与图像增强  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?