IOS高级开发 runtime(1)

2020,300道高级iOS开发面试题(最新整理) 这个栏目将持续更新–请iOS的小伙伴关注! 一:知名大厂iOS开发面试题篇 1、腾讯—最新iOS面试题总结 2、百度—最新iOS面试题总结 3、头条—最新iOS面试题总结 4、阿里—最新iOS面试题总结 5、美团—最新iOS面试题总结 6、某大厂—最新iOS面试题总结 7、抖音–最新iOS面试题总结 8、拼多多–最新iOS面试题总结 9、快手–最新iOS面试题总结 10、虎牙–最新iOS面试题总结 11、iOS面试–最新快手iOS面试题 12、iOS面试–字节跳动最新iOS开发面试题 13、(最新)iO. 阅读详情

一、 简介

IOS 开发中灵活使用runtime 会提高我们的程序性能和开发速度。要想使用runtime,首先要引入系统的头文件。

#import <objc/runtime.h> 

当我们查看runtime.h的时候,我们会发现,其实runtime是很有条理的

const char *object_getClassName(id obj)                     //获取对象的类

Ivar *class_copyIvarList(Class cls, unsigned int *outCount) //获取类的变量列表

unsigned method_getNumberOfArguments(Method m)              //获取函数变量的个数

属性 其实就是get/set 方法。我们可以使用  objc_setAssociatedObject/objc_getAssociatedObject  实现 动态向类中添加 方法

objc_setAssociatedObject 需要四个参数:源对象,关键字,关联的对象和一个关联策略。
//1 源对象alert
//2 关键字 唯一静态变量key associatedkey
//3 关联的对象 sender
//4 关键策略  OBJC_ASSOCIATION_RETAIN_NONATOMIC

通过 objc_getAssociatedObject获取关联对象

使用函数objc_removeAssociatedObjects可以断开所有关联。通常情况下不建议使用这个函数,因为他会断开所有关联。只有在需要把对象恢复到“原始状态”的时候才会使用这个函数。

二、runtime 大招


     2.1)为已有的类添加属性

OC语法允许我们通过继承或者添加分类(category)修改(也不能说修改,就是改造成我们需要的类)已有的类。继承在这里不是我们想讨论的,主要是想说一下分类。分类可以允许我们添加属性(不会生成get和set方法,需要手动添加)和方法,但是却不允许我们添加成员变量。但是有些时候,我们需要添加一个变量来扩充这个类,比如:我有一个类Person类,带有age 和name 属性

  1. #import <Foundation/Foundation.h>  
  2.   
  3. @interface zzPerson : NSObject  
  4.   
  5. @property(nonatomic,weak)NSString *name;  
  6. @property(nonatomic,assign)NSInteger age;  
  7.   
  8. @end  
但是,后来我们发现,仅仅这两个属性是不够描述的,我们还需要添加一个job属性来描述一个人。因此我们想到了用分类来添加属性。

  1. #import "zzPerson.h"  
  2.   
  3. @interface zzPerson (Job)  
  4.   
  5. @property(nonatomic,copy)NSString* job;  
  6.   
  7. @end
 但是事情往往没有那么简单,当我们运行程序时就会发现,程序崩溃了。
  1. - (void)viewDidLoad  
  2. {  
  3.     [super viewDidLoad];  
  4.     DZLPerson *p=[[zzPerson alloc] init];  
  5.     p.age=25;  
  6.     p.name=@"皮拉夫大王";  
  7.     p.job=@"ios";  
  8.       
  9.     NSLog(@"%@",p);  
  10.   
  11. }
  12. 2015-04-10 00:05:50.591 runtime讲解[4197:209347] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[DZLPerson setJob:]: unrecognized selector sent to instance 0x7fe809f24790'  
程序提示我们:找不到setJob方法。这是理所当然的,因为系统不能为我们自动添加成员变量了,也就不知道该如何帮我们创建setter 和getter方法了。但是我们可以通过runtime来添加属性,使我们能够像真正的修改了Person类那样使用新的属性job。

首先在分类的.m 中导入runtime头文件,然后重写job的getter 和setter 方法。

  1. #import "zzPerson+Job.h"  
  2. #import <objc/runtime.h>  
  3.   
  4.   
  5. static NSString *key=@"zz"; //利用静态变量地址唯一不变的特性  
  6.   
  7. @implementation zzPerson (Job)  
  8.   
  9. -(void)setJob:(NSString *)job  
  10. {  
  11.   
  12.     objc_setAssociatedObject(self, &key, job, OBJC_ASSOCIATION_COPY);  
  13. }  
  14.   
  15. -(NSString *)job  
  16. {  
  17.     return objc_getAssociatedObject(self, &key);  
  18. }  
  19.   
  20. @end   

 建立关联引用,将这个对象和我们所利用的唯一不变的地址进行关联,而关联则是job属性,这样的话由于建立关联的对象存在,所进行关联的键唯一,所以我们的属性也被唯一保存了,如同保存在对象自身上一样。



【移动产品】ArcGIS Runtime SDK for iOS的新版本10.1.1发布 内容提要 1、新版的iOS SDK更名又发生了变化,为什么要更名呢,请看博文; 2、新版iOS SDK又带来了哪些可喜的变化,请看博文; 3、旧版应用如何迁移至新版本,请看博文。 为何更名?         很高兴在新年发布ArcGIS Runtime SDKfor iOS的新版本10.1.1,更新内容包括:支持高级军事符号、支持PKI客户端验证的安全链接、位置定 阅读详情

相关推荐

Runtime详解——iOS开发中的黑魔法

简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的。比如: [receiver message]; // 底层运行时会被编译器转化为: objc_msgSend(receiver, selector) // 如果其还有参数比如: [receiver message:(id)arg...]; // 底层运...

IM_Hank的博客 638

iOS 开发 Runtime到底是什么?

Runtime到底是什么?这个问题一直以来都困扰着大家的,做iOS开发,天天和Object-c打交道,却对runtime到底是什么感觉到很费解? 那么我们就先了解熟悉的东西:Object-C做iOS开发做的最基本的操作:类,对象,属性,方法,—无论你做什么功能都离开这四个最基本的东东,包括网络请求,代理协议,通知,block,多线程,KVC/KVO,内存管理等等.都是用哪个类创建哪个对象,修改类的属

高级软件开发工程师--周玉的博客 1831

iOS面试中经常问的点 - RunTime

一. RunTime简介RunTime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制。对于C语言,函数的调用在编译的时候会决定调用哪个函数,如果调用未实现的函数就会报错。对于OC语言,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要声...

程序猿 2327

IOS 开发— Runtime 机制

IOS 开发— Runtime 机制 Runtime 底层原理与应用 Runtime 又叫运行时,是一套IOS底层的C语言API。Objective-C在运行时被转化为C语言的API。Objective-C时一门动态语言,在代码运行才进行处理和编译。因此需要一个运行时系统(Runtime System)来处理编译后的Code。 Runtime 基本是用C和汇编实现的,苹果和GNU各自维护一套Run...

HiroGuo 的博客 571

iOS开发:Runtime解析

Runtime,又叫运行时,是一套关于底层的C语言API,为iOS内部的核心之一,我们在编写OC代码的时候,底层都是基于它来实现的。

全沾软贱开发攻城狮 1万+

Allegro 16.6 高级技巧实战:用Region规则和动态间距搞定高密度连接器布局布线

本文深入探讨了Allegro 16.6在高密度连接器布局布线中的高级技巧,重点介绍了Region规则和动态间距属性的应用。通过局部规则覆盖和分层控制,解决0.5mm以下引脚间距的布线难题,提升PCB设计效率和质量。

weixin_30352645的博客 439

IOS高级开发~Runtime(一)

一些公用类: @interface CustomClass : NSObject - (void) fun1; @end @implementation CustomClass - (void) fun1 {     NSLog(@"fun1"); } @end @interface TestClass : NSObject @end @implemen

阿福的专栏 2万+

基于ResNet-50的猫狗分类训练

基于ResNet-50的猫狗分类python训练

weixin_46352497的博客 1004

【iOS开发】—— 初学Runtime

Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发。Objective-C 扩展了 C 语言,并加入了面向对象特性和 Smalltalk 式的消息传递机制。而这个扩展的核心是一个用 C 和 编译语言 写的 Runtime 库。它是 Objective-C 面向对象和动态机制的基石。Objective-C 是一个动态语言,这意味着它不仅需要一个编译器,也需要一个运行时系统来动态的创建类和对象、进行消息传递和转发。

qq_72437394的博客 1152

解锁RK3588视觉潜能:RGA硬件加速库实战指南

本文深入探讨了如何利用RK3588芯片内置的RGA硬件加速库,解决视觉应用中图像预处理的性能瓶颈。通过实战指南,详细介绍了RGA库在YUV转RGB、图像缩放等核心操作上的应用,相比CPU软处理可大幅降低延迟与CPU占用,从而充分释放RK3588的NPU算力,构建高效的AI视觉预处理流水线。

zeta9的博客 669

避坑指南:ArcGIS 做莫兰指数分析,你的‘空间关系概念化’选对了吗?

本文深入解析了ArcGIS中莫兰指数分析的关键参数——'空间关系概念化'的选择策略。通过对比反距离法、固定距离法和K最近邻法的适用场景与影响机制,帮助研究者避免常见误区,提升空间自相关分析的准确性和解释力。特别针对全域莫兰指数和局域莫兰指数的计算差异提供了实用建议。

weixin_30872157的博客 805

iOS开发之Runloop和Runtime

RunLoop 对于一个iOS开发者,如果你的水平只是停留在会用API的级别,那说明你与大神还是慢慢长路,本文章大家一块学习一些深层次的东西,RunLoop和Runtime。Runloop官方文档 你肯定写过一个按钮点击事件,点击界面上的一个按钮,这个时候就会有对应的按钮响应事件发生。给我们的感觉就像应用一直处于随时待命的状态,在没人操作的时候它一直在休息,在让它干活的时候,它就能立刻响应。其实

逝水无情的博客 3233

【AI Guide】AI面试攻略只用看这一篇就够了!力争做全网最全的AI面试攻略——大模型(五)Adapter 微调

Adapter 微调(Adapter Fine-tuning)是一种高效的参数高效微调(PEFT)方法。相较于全参数微调(Full Fine-tuning),Adapter 在预训练模型的特定层插入轻量级的可训练模块,而冻结原始模型参数,从而减少计算和存储开销。是缩放因子,控制 Adapter 输出的影响程度。设 Transformer 层的隐藏状态为。为 Adapter 层的可训练参数,为非线性激活函数,如 ReLU。为冻结的预训练模型参数,

AI科研社 183

【iOS】Runtime

Runtime就是一套C语言API,封装了很多动态性相关的函数,平时编写的OC中动态相关的代码底层都会转换成Runtime API进行调用

XY_Mckevince的博客 1320

【AI大模型应用开发】【LangChain系列】实战案例6:利用大模型进行文本总结的方法探索,文本Token超限怎么办?

假设有一组文档(PDF、Notion页面、客户问题等),你想要总结内容。可以利用大模型来帮你。今天来系统看下利用大模型来对文本进行总结的方法,以LangChain的使用为例。

同学小张的博客 3749

肺癌术后随访离散选择实验(DCE)设计与SAS实现

随着肺癌早期诊断和治疗技术的进步,肺癌患者的生存率显著提高,术后随访管理成为提升患者生活质量的关键环节。然而,如何在有限的医疗资源下设计出既符合患者需求又具有成本效益的随访方案,是临床决策面临的重要挑战。 离散选择实验(Discrete Choice Experiment, DCE)是一种定量研究方法,通过模拟真实世界的选择情境,测量患者对不同随访方案属性的偏好程度。本研究旨在通过DCE方法,系统评估肺癌术后患者对随访服务的偏好,为制定以患者为中心的随访策略提供循证依据。

huanghm88的专栏 99

IOS高级开发~Runtime(三)

11、系统类的方法实现部分替换 - (void) methodExchange {     Method m1 = class_getInstanceMethod([NSString class], @selector(lowercaseString));     Method m2 = class_getInstanceMethod([NSString class], @selec

阿福的专栏 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

iOS高级理论:Runtime应用

创建一个UIViewController的分类,重写自定义的ViewDidAppear方法,并在其+load方法中实现ViewDidAppear方法的交换。(2) 开发中常需要在不改变某个类的前提下为其添加一个新的属性,尤其是为系统的类添加新的属性,这个时候就可以利用Runtime的关联对象(Associated Objects)来为分类添加新的属性了。通过使用 Runtime 遍历类的属性,我们可以实现一个通用的归档和解档方法,而无需手动编写大量的归档代码。方法则对归档的数据进行解档,恢复对象的状态。

长沙火山 1182

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ios Runtime(一) 详解

简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的。 Runtime的特性主要是消息(方法)传递,如果消息(方法)在对象中找不到,就进行转发 Runtime 的作用 Objc 在三种层面上与 Runtime 系统进行交互: 1.通过 Objective-C 源代码 2.通过 Foundation 框架的...

Z1591090的博客 1263

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

IOS高级开发~Runtime(二)

一些公用类: @interface ClassCustomClass : NSObject{     NSString *varTest1;     NSString *varTest2;     NSString *varTest3; } @property (nonatomic, assign) NSString *varTest1; @property (nonat

阿福的专栏 1万+

Runtime在iOS开发中的实际应用

运行时的文章一直被同学们热炒,当然现在面试中也都喜欢问道,当大伙说的头头是道时候,可到真正的项目中几乎局限只会关联对象或者MethodSwizzling奉为神剑到处挥砍,开发毕竟不能纸上谈兵,实践出真知,介绍目前在项目中runtime的具体使用,真切希望和各位同学探讨。(个人的使用)使用 runtime 为 UIButton 分类修改响应位置 使得点击范围扩大https://github.com/...

qq_41597968的博客 1175

iOS开发:认识一下Runtime

runtime(简称运行时),是一套纯C(C和汇编)编写的API。而OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制 objc_msgSend。

wuwuFQ的博客 1164

ios runtime重要性_ios中Runtime的介绍以及使用

ios黑魔法--runtime介绍:在Xcode5以后 ,苹果不建议开发者使用底层。为了能够使用runtime,我们需要做下面两个配置:1.在需要使用runtime的地方导入#import。2.在工程的Build Setting中搜索msg ,将其修改为NO。引入:在开发中,用对象去调用方法:如:我们定义了一个Person类其中有两个方法:-(void)eat;//对象方法+(void)eat;/...

weixin_35924719的博客 287

iOS之runtime

参考: https://www.jianshu.com/p/9e975a1cab93 https://www.jianshu.com/p/6ebda3cd8052 https://blog.ibireme.com/2013/11/26/objective-c-messaging/ 本文不是讲解,只做面试梳理。 1、isa指针 //对象 struct objc_object { ...

ihoudf 532

IOS开发之Runtime(三)

第2阶段: 有一个bool类型的变量标记是否进入过动态方法解析阶段,如果为true进入第3阶段消息转发,如果为false,调用 +resolveInstanceMethod: 或者+resolveClassMethod: 方法来动态解析方法,标记为已经动态解析,再次进入第1阶段消息发送,如果走完第1个阶段还是没有解决,此时这个bool类型的变量为true,直接进入第3阶段消息发送。forwardingTargetForSelector:方法,有实例方法也有类方法。objc_msgSend的汇编。

m0_63640651的博客 589
上一篇: iPhone图片拉伸的几种方法
下一篇: KVO-键值观察者
LIN1986LIN
博客等级 码龄19年 17粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值