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 】
相关推荐:
如何确保西部建站助手FTP传输的安全性?
nodejs redis 发布订阅机制封装实现方法及实例代码
免费网站制作appp,免费制作app哪个平台好?
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
Laravel如何为API生成Swagger或OpenAPI文档
Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门
ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】
phpredis提高消息队列的实时性方法(推荐)
怎么用AI帮你为初创公司进行市场定位分析?
Swift中switch语句区间和元组模式匹配
如何在万网主机上快速搭建网站?
Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】
如何在宝塔面板中修改默认建站目录?
Python文件流缓冲机制_IO性能解析【教程】
昵图网官网入口 昵图网素材平台官方入口
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
C++用Dijkstra(迪杰斯特拉)算法求最短路径
,南京靠谱的征婚网站?
大学网站设计制作软件有哪些,如何将网站制作成自己app?
javascript中闭包概念与用法深入理解
Android okhttputils现在进度显示实例代码
微信推文制作网站有哪些,怎么做微信推文,急?
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】
在Oracle关闭情况下如何修改spfile的参数
Laravel怎么使用Intervention Image库处理图片上传和缩放
如何在万网开始建站?分步指南解析
香港服务器租用每月最低只需15元?
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
jquery插件bootstrapValidator表单验证详解
java获取注册ip实例
Laravel如何实现多对多模型关联?(Eloquent教程)
如何在Ubuntu系统下快速搭建WordPress个人网站?
bing浏览器学术搜索入口_bing学术文献检索地址
Laravel如何使用Blade模板引擎?(完整语法和示例)
新三国志曹操传主线渭水交兵攻略
制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?
Internet Explorer官网直接进入 IE浏览器在线体验版网址
黑客如何利用漏洞与弱口令入侵网站服务器?
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程
如何用免费手机建站系统零基础打造专业网站?
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
网站建设整体流程解析,建站其实很容易!
,怎么在广州志愿者网站注册?
Python高阶函数应用_函数作为参数说明【指导】

