iOS Runtime

iOS Runtime面试题 前言: 上一篇文章我们讲了主线程如何进行阻塞,在此,我分享给大家,希望我的这篇文章能给你有所帮助,更多的面试题在这:docs.qq.com/doc/DTWxwWE… 一._[self class] 与 [super class] 下面的代码输出什么? @implementation Son : Father - (id)init { self = [super init]; if (self) { NSLog(@"%@", NSStringF 阅读详情

本文源自https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/ObjCRuntimeGuide.pdf

Objective-C 程序与runtime系统的交互有三个唯一的层次:通过Objective-C源代码的方式;通过NSObject类里面的方法;通过直接调用runtime函数。

Objective-C源代码
大部分情况,runtime系统自动工作并且隐藏在屏幕背后,编译器创建数据结构和函数调用(实现动态特性得语言)。数据结构捕获类或者category定义得信息和协议里面声明的东西;包括类和协议对象,同样包括selector,实例变量模版和源码中的其他信息。主要的runtime函数是发送消息。它会在源码发送消息是调用。

NSObject Methods
大部分Cocoa对象都是NSObject类的子类,所以大部分对象都继承了它定义的方法(NSProxy是一个例外)。每个继承了NSObject的对象和类都建立了这些继承来的行为。然而,在一些情况下,NSObject类很少定义一个模版一个事情该怎么做,它没有提供所有必须的代码。

比如,NSObject类定义了一个description的实例方法来返回一个描述类的内容的字符串。这主要用在调试过程中,在GDB print-object命令就是打印的description返回的字符串。NSObject’s 实现这个方法的是好并不知道类包括什么,所有它返回一个类的名字和对象的地址。NSObject子类能够实现这个方法并且返回更多的细节。比如,基础类NSArray返回了它所包含的对象的列表。

一些NSObject方法简单的向runtime系统查询一些信息。这些方法允许对象进行自省。典型的方法就是class方法,它要求对象定义它的类;isKindOfClass和isMenberOfClass测试对象在继承层次中的位置,responseToSelector指出一个对象是否接收一个特殊的消息。conformsToProtocol和methodForSelector提供了方式实现的地址。像这些方法提供给一个对象自己查看自己的能力。

Runtime 函数
runtime系统是一个动态共享库,有一个公共的接口包含一系列的函数和数据结构在/usr/include/objc的头文件中。他们中的许多函数允许你使用C来实现你写Objective-c代码时编译器做的事情。其他的形成了基本的功能输出通过NSObject类的函数。这些函数让开发runtime系统其他的接口和
扩大开发环境成为了可能。在用Objective-c编程时这些东西是不需要的。然而,一些runtime函数可能在一些场合比较有用。所有的函数都可以在Objective-c Runtime Reference中查到。

消息(Messaging)
本部分描述消息表达式是如何转化程objc_msgSend函数调用的,你是如何通过名字来调用函数的。然后解释你能通过objc_msgSend获取哪些优势,怎么做?当你需要时,你能够避免使用动态绑定。

objc_msgSend函数
在objective-c中,消息直到runtime时才绑定方法实现。编译器转化一个消息表达式[receiver message]成为一个消息函数的调用,objc_msgSend。这个函数把receiver和消息中提及的方法名(@selector(message))当作主要的参数:
objc_msgSend(receiver, selector);
传给消息的参数放在后面,如下:
objc_msgSend(receiver, selector, arg1, arg2,…);

消息函数完成所有的动态绑定必要的事情:
1. 它首先找到这个selector指向的处理过程。同样的方法名可以通过不同的类有不同的实现,准确的处理过程是取决于receiver的类。
2. 接着它调用这个处理过程,传给这个过程接收对象,还有指定的参数。
3. 最后,它把处理过程的返回值当作自己的返回值返回。
注意:编译器产生这个消息函数的调用。你不能指定在你的代码中调用。

消息依赖于编译器为每个对象和类构建的结构。每个类的结构包含下面两种本质的元素:
1. 一个指向父类的指针
2. 一个类的dispatch table。这个表的内容是方法的selectors关联到类定义的函数的地址的映射。@selector(setOrigin)关联setOrigin函数的地址,@selector(display)关联display的地址等等。

当一个对象被创建了,它会被分配内存,然后它的实例变量被初始化了。 对象的第一个变量是一个指向它类结构的指针。这个指针叫做isa,提供了一个对象访问它的类和它继承的所有的类。
注意:这严格来说不是语言的一部分,这个isa指针在对象需要与Objective-c runtime系统交互时使用。一个对象需要等价成一个objc_object的结构体这个结构定义的任何字段。然而,你很少,需要创建自己的根对象,所有继承NSObject或者NSProxy自动拥有isa变量。

类和对象的元素的结构如下图所示:

当一个消息被发送到一个对象时,消息函数跟着对象的isa指针到它的类结构的dispatch表中去查找方法selector。如果它在那里找不到selector,objc_msgSend会跟着指向父类的指针在父类的dispatch表中查找这个方法的selector。失败的的话会导致objc_msgSend一直查找到NSObject类。一旦它找到这个selector,函数就调用表中的这个方法并且传递结构的对象的数据结构。

这就是一种方式来达到方法实现的选择在runtime,或者说在面向对象编程的行话中说的,方法是动态绑定到消息的。

为了加速消息处理过程,runtime系统缓存它曾经使用过的selectors和方法的地址。这里为每个方法都有一个分离的缓存,它可以包含继承的方法的selectors就像这些方法在类里面定义的一样。在查找dispatch表之前,消息路由首先检查消息接收对象的缓存。如果方法selector在缓存中,消息只会比函数调用慢很少的一点点。一旦一个程序已经允许足够长时间来加热它的缓存,基本上它发送的所有的消息都能找到一个缓存的方法。程序运行时缓存动态的增长来适应新的消息。

使用隐藏对象
当objc_msgSend找到了方法的处理过程,它调用这个处理过程并且传给它消息中所有的参数。它同时提供了两个隐藏的参数:
1. receive object
2. the selector for the method

这些参数提供给每一个方法实现明确的信息关于两个半它调用的消息表达式。他们是隐藏的是因为定义方法时他们不在源代码中声明。他们在代码编译时被插入到实现中去了。

尽管这些参数没有显示的声明,源代码仍然能够使用他们。方法用self来使用这个receiving对象,用_cmd来使用它自己的selector。在下面的例子中,_cmd指的是strange方法的selector,self指的是接收strange消息的对象。

- strange 
{
       id target = getTheReceiver();
       SEL method = getTheMethod();     
       if (target == self || method == _cmd) 
             return nil;
      return [target performSelector:method];
}

self 在这两个参数中更有效。事实上,这就是让接收对象的实例变量提供给方法定义的方式。


获取方法地址

唯一的方来来避免对台绑定就是获取这个函数地址然后直接调用它就像它本身就是一个函数一样。这可能在很少的情况下是合适的,当一个特定的方法可能会被连续的执行很多次,你希望避免每次方法执行是消息的开销。

通过一个在NSObject类中定义的方法,methodForSelector:,你可以获取一个指向这个方法的实现过程的指针,接着使用这个指针来调用这个实现过程。这个从methodForSelector:返回的指针必须仔细的转成正确的函数类型。在转换的过程中返回类型和参数必须包含。

以下的例子展示了setFilled方法的处理过程可能被调用:
void (*setter)(id, SEL, BOOL);
int i;
setter = (void (*)(id, SEL, BOOL))[target
    methodForSelector:@selector(setFilled:)];
for ( i = 0 ; i < 1000 ; i++ )
    setter(targetList[i], @selector(setFilled:), YES);
传递给处理过程的最开始的两个参数是这个接收对象本身(self)和方法selector(_cmd)。这些参数隐藏在方法语法中但是在方法当作一个函数调用时必须显示给出。

使用methodForSelector:来避免动态绑定节约了大部分消息过程中的时间。然后,这些节约的时间只有在特定的消息被重复很多遍时才有意义,就像上面的for循环那样。

注意methodForSelector:是Cocoa runtime系统提供的,这不是Objective-C语言本身的。

动态方法解决方式
本部分描述了你如何动态的提供一个方法的实现。

你可以实现方法resolveInstanceMethod:和resolveClassMethod来动态的为一个给定的selector提供一个实现分别给实例和类方法。
一个Objective-C方法是一个C至少提供2个参数(self,_cmd)的函数。你可以使用函数class_addMethod添加一个函数给一个类方法。给定下面这个函数:
void dynamicMethodIMP(id self, SEL, _cmd) {
     //implementation ...
}
你可以动态的将它当作一个方法添加到类中(类中的方法叫resolveThisMethodDynamically)使用resolveInstanceMethod:如下:
@implementation MyClass

+ (BOOL)resolveInstanceMethod:(SEL)aSEL 
{
     if (aSEL == @selector(resolveThisMethodDynamically)) {
          class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, “v@:");
          return YES;
     }
     return [super resolveInstanceMethod:aSEL];
}

传递方法和动态方法方案很大程度上是正交的。一个类有机会动态的解决一个方法在传递机制进入前。如果respondsToSelector:或者instancesRespondToSelector:被调用了,动态方法解决者有机会首先提供一个IMP给这个selector。如果你实现了resolveInstanceMethod但是希望特定的selectors实际上通过传递机制来传递时,你可以给这些selectors返回NO.

动态加载
一个Objective-C程序在运行时可以加载和连接新的classed和categories。新的代码加入到程序中并且被开始装载的类和categories同等的对待。

动态装载可以用来做许多不同的事情。比如系统偏好设置程序的不同的模块可以动态的加载。

在Cocoa环境中,动态加载通常用来允许程序被自定义。其他的人可以写一些模块你的程序可以在运行时加载。这些加载的模块可以扩展你的程序可以做的事情。它们用这样你允许的方式来做出贡献,你不用自己参与(anticipate)和定义。你提供框架,其他人提供代码。

尽管有一个runtime函数为Objective-C模块执行动态加载,Cocoa’s NSBundle 类提供了一个重要的更加方便的接口来进行动态加载,面向对象和相关服务的集成。

消息传递(Message Forwarding)
发送一个消息给一个不处理该消息的对象是一个错误。然后在宣布这个错误之前,runtime系统给这个接收消息的对象有第二次处理这个消息的机会。

传递(传递)
如果你发生一个消息给一个不处理这个消息的对象,在宣布这个错误之前runtime发送给这个对象一个forwardInvocation:消息,唯一的参数是NSInvocation对象,这个对象封装了原始的消息和需要传递给它的参数。

你可以实现forwardInvocation:方法来提供一个默认的响应给一个消息,或者用其他的方式来避免错误。就像它的名字表示的,forwardInvocation:通常用来将消息传递给另外一个对象。

查看这个范围和打算传递时,想像以下情景:假设,首先你设计一个对象可以响应叫做negotiate的消息,然后你希望这个响应包括另外一个类型对象的响应。你可以简单的完成这个任务,你在你实现的negotiate实现方法中传递一个negotiate消息给其他的对象来达到目的。

在次基础上更近一步,假设你希望你的对象能够响应一个negotiate消息恰好在另外一个类中实现了这个响应。一个方法来完成就是让你的类从其他的类中继承这个方法。然而,不太可能像这样安排事情。有很多原因为什么你的类和实现negotiate方法的类在不同的继承层次的分支上。

即使你的类不能继承这个negotiate方法,你仍然能借用它通过实现下面这个方法,简单的把消息传递给那个类的一个实例:
- (id) negotiate 
{
       if ([someOtherObject respondsTo:@selector(negotiate)]) 
      {
               return [someOtherObject negotiate];
      }
      return self;
}

这种方法来处理这个事情可能有一点不灵活,特别是当有很多消息你希望你的对象传递给其他对象时。你可能必须实现一个方法覆盖所有的你希望从其他对象借用的消息。而且,不太可能处理那些你还不知道的情况在你写代码时候,一个完整的你希望传递的消息集合。这个集合可能依赖runtime的事件,并且它可能会因为新方法和新类的实现而改变。

由forwardInvocation:提供的第二次机会来处理这样的问题,并且这是通过动态实现的。它工作的方式如下:当一个对象不能响应一个消息时因为它没有方法匹配消息中的这个selector,runtime系统发送forwardInvocation:消息通知对象。每一个对象都从NSObject类继承了forwardInvocation:方法。然而NSObject’s 的这个方法仅仅是简单的调用了doesNotRecognizeSelector:,通过你自己的代码重写这个方法,你可以获取这个机会,forwardInvocation:消息提供了一个传递消息给别的对象。

为了传递一个消息,forwardInvocation:方式需要做的是:
1. 决定哪些方法需要传递
2. 把原始的参数传递给它

消息可以通过invokeWithTarget来发送:
- (void) forwardInvocation:(NSInvocation *)anInvocation 
{
     if (someOtherObject respondsToSelector:[anInvocation selector]])  
          [anInvocation invokeWithTarget:someOtherObject];
     else 
          [super forwardInvocation:anInvocation];
}

它所传递的消息的返回值返回给原始的发送者。所有的返回类型都可以传递给发送者,包括ids,结构,双精度浮点数。

一个forwardInvocation:方法可以当作一个不认识消息的分发中心,分发它们给不同的接受者。或者它可以是一个传输站,发送所有的消息到一个目的地。它可以传递一个消息给另外一个对象,或者简单的吞下一些消息导致没有任何响应和错误。一个forwardInvocation:方法可以合并多个消息到一个单独的响应。forwardInvocation:能实现什么取决于实现者。然而,在传递链中它给连接对象提供的机会提供了程序设计的潜力。
注意:forwardInvocation:方法获得这个消息只有在不能调用receiver中已经存在的方法。比如,你希望你的对象传递negotiate消息给另外一个对象,你的对象不能由一个negotiate方法。如果它有了这个方法,消息永远不会到达receiver。

更多的forwarding和invocations信息,查看NSInvocation class清单。

转发和多继承
转发模仿继承,在Objective-C程序,可以用来借用一些多继承的效果。如下所示,一个对象通过借用或者继承另外一个类中定义的方法的实现通过转发来响应这个消息。

在这个描述中,一个Warrior类的实例转发一个negotiate消息给一个Diplomat类的实例。Warrior会像Diplomat一样响应negotiate。看起来就像响应了negotiate消息,实际目的它确实响应了。

对象转发了一个消息就像继承了方法重不同的继承层次的分支,它自己的分支和响应消息对象的分支。上面这个例子中,就像Warrior类继承自它的父类Diplomat。

转发提供了大部分的典型的需要多继承的特性。然而,两者中有一个重要的不同点:多继承合并不同的能力到一个的对象中。它趋向于导致大的,多面的对象。转发,相反的,赋予分开的能力给不同的对象。它分解问题成更小的对象,但是为消息发送者透明的关联这些对象。

代理对象(Surrogate Objects)
转发不仅仅是模仿多继承,它同时使开发轻量级的对象来表示或者覆盖更多重要的对象成为可能。代理代表了其他的对象并且为它们过滤消息。

在The Objective-C Programming Language中讨论的Proxy就是这样的一个代理。一个proxy为远程接受者精心的管理转发消息的细节,确保参数值得到复制,通过链接进行检索等等。但是它没有打算做其他事情的意图;它不复制远程对象的功能,仅仅只是简单了给远程对象一个局部的地址,这个地址它可以接收其他对象来的消息。

还有其他类型的代理对象。假设,你有一个对象可以操作很多数据,可能它创建复杂的图片或者读取磁盘文件的内容。设置这个对象可能是耗时的,所以你可能懒惰的处理它,当它真的需要或者当系统资源临时空闲时才处理它。在这个时候,为了让应用中其他的对象功能正常你需要至少一个这个对象的占位符。

在这样的情形中,你可以初始化创建,但是不需要完整的充实这个对象,但是一个轻量级的代理。这个对象可以做一些事情,比如回答一些关于数据的问题,通常只是大对象的一个占位符,随着时间的推移,转发消息给它。当代理的forwardInvocation:方法首先接收到发往另一个对象的消息,它可能确保对象存在并且在不存在的时候创建它。大对象的所有的消息都通过代理,因此,对于程序的其他部分需要关注的,代理和这个大对象是一样的。

转发和继承
尽管转发模仿继承,NSObject类从来不会把它们搞混淆。像respondsToSelector:和isKindOfClass只有在继承层次中,不会在在转发链中。比如,一个
Warrior对象问它是否能响应一个negotiate消息,if [aWarrior respondsToSelector:@selector(negotiate)] ,它会返回NO,尽管它能接收negotiate消息并且能够响应它,通过转发它们给Diplomat。

在很多情况,NO是正确的回答,但是有时候不是。如果你使用转发来设置一个代理对象或者扩展类的能力,转发机制必须正确的像继承一样透明。如果你希望你的对象通过转发消息表现得就像继承对象得到的行为一样,你可能需要重新实现respondsToSelector:和isKindOfClass:方法来配合你的转发算法。

- (BOOL)respondsToSelector:(SEL)aSelector 
{
      if ([super respondsToSelector])
          return YES;
     else 
         // Here, test whether the aSelector message can be forward to another object .
     return NO;
}

除了上面的两个方法,instancesRespondToSelector:方法必须反映转发算法。如果协议被使用了,conformsToProtocol:方法必须同样的需要添加到列表中。类似的,如果一个对象转发任何它接收的远程消息,它必须有一个methodSignatureForSelector:来返回这个方法的正确的描述最后用来响应被转发的消息。比如,如果一个对象可以转发一个消息给它的代理,你必须实现methodSignatureForSelector:如下:
- (NSMethodSignature*)methodSignatureForSelector:(SEL)selector
{
    NSMethodSignature* signature = [super methodSignatureForSelector:selector];
    if (!signature) {
       signature = [surrogate methodSignatureForSelector:selector];
    }
    return signature;
}
你可能考虑把转发算法放在私有代码中,并拥有所有这些方法,包括forwardInvocation:。
注意:这是一个高级的技术,只有在没有其他解决方案时候才使用。它不打算取代继承。如果你必须使用这个技术,确保你已经完全理解了这些转发的行为和那些对象你用来转发的。
上面提到的方法在NSObject类中列出了。

【福建dem】原始高程数据tif格式 DEM(Digital Elevation Model,数字高程模型)是一种地理信息系统中的关键数据集,它提供了地表地形的三维信息,通常用于分析地貌特征、模拟水文过程、规划建设、灾害预警等多个领域。这种数据对于地理分析非常有价值,例如,它可以用于计算坡度、坡向、地形粗糙度等地形特征,或者进行洪水模拟、地质灾害评估、太阳能辐射分析等。“福建dem原始高程数据tif格式”是研究和理解福建省地形地貌的重要资源,结合GIS工具,可以揭示丰富的地理信息,为科研、工程和决策提供有力支持。 阅读详情

相关推荐

先进半导体材料与器件Chapter3

Chapter3 异质结双极晶体管(HBT) 作者:毛茏玮 / Saint 掘金:https://juejin.im/user/5aa1f89b6fb9a028bb18966a 微博:https://weibo.com/5458277467/profile?topnav=1&wvr=6&is_all=1 GitHub:github.com/saint-000 知乎:https:/...

一个会写代码的烤鸭 5803

isKindOfClass和isMemberOfClass的区别

isKindOfClass 当子类是该类的派生类或者父类时, 返回值是YES; isMemberOfClass 只有当子类是该类的类型时,返回YES UILabel *label = [[UILabelnew]autorelease]; if ([label isKindOfClass:[UILabelclass]]) { NSLog(@" is K

#### 349

CondaHTTPError: HTTP 404 NOT FOUND for url

用conda创建新环境时出现问题了。

qq_40713201的博客 1269

OC中isKindOfClass和isMemberOfClass的区别

首先看看两个方法的苹果官方解释: isKindOfClass: Returns a Boolean value that indicates whether the receiver is an instance of given class or an instance of any class that inherits from that class. (required) 这个方法用来判

坚持自己! 4090

项目风险管理全流程解析

按技术、资源、市场、外部环境等类型对风险进行分类,便于团队快速识别风险,提高风险管理效率,避免风险遗漏。项目结束后,总结实际发生的风险和应对效果,找出风险管理中的经验和教训,为后续项目提供参考。

qq_34062333的博客 1471

跨时钟域传输数据——单bit和多bit信号(总结)

总结单bit和多bit信号的跨时钟域传输

qq_42135020的博客 1万+

OC基础语法学习笔记

Objective-C语法: 一:对象声明语法:类名 * 对象名 = [[类名 alloc] init] [对象名 release] //释放对象的实例 注:alloc是NSObject的类方法,init是实现类的初始化方法 二:类 @interface MyClass:NSObject //接口 { int count; id data;

playStudy的专栏 816

433MHz无线通信避坑指南:如何解决信号干扰和误码问题

本文深入探讨433MHz无线通信中的信号干扰和误码问题,提供从射频前端设计到协议优化的全链路解决方案。通过天线匹配、电源噪声抑制、曼彻斯特编码改进及实时频点切换等技术,显著提升通信稳定性和距离。适合智能家居和工业无线控制系统的开发者参考。

weixin_29288313的博客 417

【iOS】Runtime

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

XY_Mckevince的博客 1320

Keil5保姆级安装指南:从破解到STM32开发环境配置(附常见错误解决方案)

本文提供Keil5从安装到STM32开发环境配置的完整指南,包含破解步骤、常见错误解决方案及多芯片支持配置。详细讲解环境预检、核心安装、许可证管理及高效开发环境设置,帮助开发者快速搭建嵌入式开发平台。特别针对安装和卸载过程中的关键问题提供专业解决方案。

weixin_30369041的博客 124

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(五级)答案 + 解析

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(五级)答案 + 解析

伶俐角少儿编程 484

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

手把手教你学Simulink——基于Simulink的全双工无线通信仿真建模示例

目录手把手教你学Simulink——基于Simulink的全双工无线通信仿真建模示例一、背景介绍二、所需工具和环境三、步骤详解步骤1:创建Simulink模型步骤2:设计输入信号步骤3:添加调制模块步骤4:添加自干扰消除模块步骤5:添加AWGN信道步骤6:添加接收端处理步骤7:添加解调模块步骤8:计算误码率(BER)步骤9:添加显示模块步骤10:设置仿真参数步骤11:运行仿真并分析结果四、总结 全双工(Full-Duplex)无线通信技术允许在同一频段上同时进行数据的发送和接收,这与传统的半双工(Half-

MHD0815的博客 182

iOS 开发 Runtime到底是什么?

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

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

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

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

weixin_35924719的博客 287

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

iOS Runtime的一些总结

iOS Runtime(运行时)是苹果系统提供的一套底层核心机制,它负责在运行时动态管理对象的一套底层核心机制,它负责在应用运行时管理对象的创建、方法调用、属性访问和内存分配,是Objective-C语言的动态特性的核心。以上就是今天对Runtime的一些总结。

qq_37397507的博客 529

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ios Runtime(一) 详解

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

Z1591090的博客 1263

ios runtime重要性_Runtime-iOS运行时基础篇

本文主要整理了Runtime的相关知识。对于一个iOS开发者来说,掌握Runtime的重要性早已不言而喻。OC能够作为一门优秀的动态特性语言,在其背后默默工作着的就是Runtime。在网上也看过很多资料,最终我还是希望在一些关键的知识点上能够融入自己的理解,从简单的问题出发,一步一步理解和学以致用。iOS运行时Runtime.png目录:一、怎么理解OC是动态语言,Runtime又是什么?二、理解...

weixin_32780623的博客 228

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解析

欢迎大家来我们的交流社区,一起来交流学习,我会定期分享一些我在项目中遇到问题的解决办法和一些iOS实用的技巧,现阶段主要是整理出一些基础的知识记录下来。 加微信邀请你加入 15388944845 RunTime一直是iOS开发中非常重要的而且必须要理解的东西,最近在学习RunTime,有自己的一些心得,现在记录下来,便于以后查阅 什么是RunTime 我们写的代码在程序运行过程中都会被转化成r...

weixin_30363981的博客 199

iOS Runtime Headers

iOS Runtime Headers 是一个开源项目,它提供了一种简单的方法来获取 iOS 中类的运行时头文件。这些头文件包含了许多有关 Objective-C 类的信息,包括方法名、属性名和协议等。 使用场景 iOS Runtime Headers 可以用于以下场景: 代码分析:通过查看某个类的运行时头文件,可以快速了解该类提供了哪些方法和属性,从而更好地理解它的功能和用途。 开发工具:许多...

gitblog_00041的博客 448

iOS runtime(一)

runtime,直译的意思就是运行时,这是iOS开发中很重要的一个概念,其本质就是消息发送机制,是iOS开发中的一个黑魔法。众所周知,OC在编译阶段,不管是否有实现这个方法,都可通过编译,这就给开发者留下了很大的空间,可以利用黑魔法,在函数执行的时候动态做一些事情。下面就是我学习runtime的一点记录。 本文介绍runtime的常用方法,包括动态获取一个对象的成员变量、属性、方法以及遵守的协议

391

ios runtime重要性_iOS 之runtime运行机制理解

Runtime 是想要做好iOS 开发,或者说是真正的深刻的掌握OC这门语言所必须的理解的东西,最近在学习Runtime。查阅方便或许能给他人一些一些启发什么是Runtime我们写的代码在程序运行过程中都会被转化成runtime的C代码执行,例如[target doSomething]; 会被转化成objc_msgSend(target,@selector(doSomething));OC中一切都...

weixin_39630855的博客 129

iOS-- Runtime

一文理解#selector()与@objc是如何实现的

ScheenDuan的博客 1938

ios runtime重要性_iOS 关于runtime的初步认识

释放双眼,带上耳机,听听看~!一、runtime简介Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的。二、runtime的用途动态修改属性值动态添加属性动态添加方法动态交换方法三、详细的代码实现过程3.1动态更改属性值使用runtime修改一个对象的属性值- (IBAction)changeProprety...

weixin_39628339的博客 103
上一篇: iOS内存管理--Core Foundation
下一篇: iOS KVO
MakeCodeClear
博客等级 码龄14年 0粉丝 11原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值