展开

关键词

Runtime 的消息机制

说道Objective-C里面的消息机制,大部分人都知道是调用方法其实就是发送消息,一个叫objc_msgSend的东西负责的。 今天结合《编写高质量iOS与OS X代码的52个有效方法》趴一趴消息机制。 发送消息的过程 在Objective-C,如果向某个对象传递消息,那就会在运行时使用动态绑定(dynamic binding)机制来决定需要调用的方法。 这样以来这个类一些频繁调用的方法会出现在fast map ,不用再去一遍一遍的在方法列表搜索了。 写在最后 《编写高质量iOS与OS X代码的52个有效方法》是一本很不错的书,想在OC做的深的一点话,最好看看这本书,必会有不少收益

53150

iOS开发 —— Runtime

这就是 Objective-C Runtime 系统存在的意义,它是整个Objc运行框架的一块基石。 Runtime基本是用C和汇编写的,可见苹果为了动态系统的高效而作出的努力。 苹果和GNU各自维护一个开源的runtime版本,这两个版本之间都在努力的保持一致。 消息传递 在很多语言中,比如C,调用一个方法其实就是跳到内存的某一点并开始执行一段代码。 具体的定义分析可以在我的另一篇 解释 Runtime 各种方法、属性的定义中去学习。 从这些定义可以看出发送一条消息也就 objc_msgSend 做了什么事。 这里叫 Fast ,只是为了区别下一步的转发机制。因为这一步不会创建任何新的对象,但下一步转发会创建一个 NSInvocation 对象,所以相对更快点。 利用 Objective-C 的 Runtime 特性,我们可以自己来对语言进行扩展,解决项目开发的一些设计和技术问题。

38130
  • 广告
    关闭

    开发者专享福利,1988元优惠券限量发放

    带你体验博客、网盘相册搭建部署、视频渲染、模型训练及语音、文字识别等热门场景。云服务器低至65元/年,GPU15元起

  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    iOS开发-Runtime详解

    iOS开发-Runtime详解 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的。 还有一些 NSObject 的方法可以从 Runtime 系统获取信息,允许对象进行自我检查。 ---- 一些 Runtime 的术语的数据结构 要想全面了解 Runtime 机制,我们必须先了解 Runtime 的一些术语,他们都对应着数据结构。 重定向 消息转发机制执行前,Runtime 系统允许我们替换消息的接收者为其他对象。通过- (id)forwardingTargetForSelector:(SEL)aSelector方法。 虽然平时我们很少会考虑一句简单的调用方法,发送消息底层所做的复杂的操作,但深入理解 Runtime 系统的细节使得我们可以利用消息机制写出功能更强大的代码。

    46190

    iOS开发-Runtime详解

    iOS开发-Runtime详解 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,其为 iOS 内部的核心之一,我们平时编写的 OC 代码,底层都是基于它来实现的。 还有一些 NSObject 的方法可以从 Runtime 系统获取信息,允许对象进行自我检查。 ---- 一些 Runtime 的术语的数据结构 要想全面了解 Runtime 机制,我们必须先了解 Runtime 的一些术语,他们都对应着数据结构。 重定向 消息转发机制执行前,Runtime 系统允许我们替换消息的接收者为其他对象。通过- (id)forwardingTargetForSelector:(SEL)aSelector方法。 虽然平时我们很少会考虑一句简单的调用方法,发送消息底层所做的复杂的操作,但深入理解 Runtime 系统的细节使得我们可以利用消息机制写出功能更强大的代码。

    31370

    iOS runtime(基础篇)

    下载地址 2、runtime是由C语言实现的 runtime做为Objective-C最核心的部分,几乎全部由C语言实现。 3.runtime的两个版本 runtime其实有两个版本:"Modern(现行)"和"legacy(早期)"。 Objective-C 2.0 之后采用的是Modern版的 runtime系统,只能运行在 iOS 和 OS X 10.5 之后的64位程序。 而OS X较老的32位程序仍采用 Objective-C 1得(早期) Legacy 版本的 runtime系统。 这两个版本最大的区别在于当你更改一个类的实例变量的布局时,在早期版本你需要重新编译它的子类,而现行版本就不需要。

    32950

    Objective-Cruntime机制的应用

    Objective-Cruntime机制的应用 一、初识runtime         Objective-C是一种动态语言,所谓动态语言,是在程序执行时动态的确定变量类型,执行变量类型对应的方法的 因为OC的动态语言特性,我们可以通过一些手段,在程序运行时动态的更改对象的变量甚至方法,这就是我们所说的runtime机制。 二、你还有什么办法操作这样的变量么?          无论声明在头文件或是实现文件,无论类型是公开的还是私有的,只要声明了这个变量,系统就会为其分配空间,我们就可以通过runtime机制捕获到它,代码如下: #import "ViewController.h 五、让我看看你的方法吧         变量通过runtime机制我们可以取到和改变值,那么我们再大胆一点,试试那些私有的方法,首先我们在MyObject类添加一些方法,我们只实现,并不声明他们: @ 六、动态的为类添加方法         这个runtime机制最强大的部分要到了,试想,如果我们可以动态的向类添加方法,那将是一件多么令人激动的事情,注意,这里是动态的添加,和类别的最大不同在于这种方式是运行时才决定是否添加方法的

    13550

    RuntimeiOS开发的实际应用

    ,介绍目前在项目中runtime的具体使用,真切希望和各位同学探讨。 1 关联对象(AssociatedObject ) Catagory主要为已经存在的类(主要是系统类)扩展新的方法,关联对象是runtime在开发应用的最广泛,其主要用于为Catagory的对象增加属性 oc消息转发差不多就是这样的。 如果返回了一个函数签名,Runtime 就会创建一个 NSInvocation 对象并发送 -forwardInvocation: 消息给目标对象。 6 逆向开发 逆向开发主要集中在iOS越狱方面,逆向开发可以让我们在iOS开发打开另一扇门,对于大部门开发者来说很少接触这个领域,我也是在工作才接触到iOS的越狱,逆向开发的基础就是利用Method

    44420

    iOS runtime映射赋值

    . // #import "BaseModel.h" #import <objc/runtime.h> @implementation BaseModel -(BOOL)reflectDataFromOtherObject

    37410

    iOS runtime(理论篇)

    2.方法的调用者会通过isa 指针来找到所属的类,然后在 cache 或者 methodLists 查找该方法,找得到就跳到对应的方法去执行。 3.如果在类没找到该方法,则通过super_class 往上一级超类查找。如果一直找到 NSObject 都没有找到该方法的话,可能就会触发到消息转发。 二. runtime 的术语的数据结构 上面讲的是执行过程里面有一些术语接下来大概介绍下。 1.SEL selector 是方法选择器,其实作用就和名字一样,日常生活,我们通过人名辨别谁是谁。 查找。 Runtime 系统会把被调用的方法存到 Cache ,如果一个方法被调用,那么它有可能今后还会被调用,下次查找的时候就会效率更高。就像计算机组成原理 CPU 绕过主存先访问 Cache 一样。

    27650

    Runtime消息转发机制

    iOS 消息发送机制 首先要知道Runtime的时候类的结构: struct objc_class { Class_Nonnull isa OBJC_ISA_AVAILABILITY; iOS对象找不到方法,系统调用机制 调用resolveInstanceMethod:方法 (或 resolveClassMethod:)。允许用户在此时为该 Class 动态添加实现。 iOS如何消息转发 1.首先在类方法列表没有找到方法,那么系统会调用resolveInstanceMethod或者resolveClassMethod,让你动态添加方法实现。 判断你要转发的SEL if ([selStr isEqualToString:@"Method2"]) { //此处返回的sig是方法forwardInvocation的参数anInvocation的 else{         [super forwardInvocation:anInvocation];     } } Demo地址:https://github.com/RainManGO/Runtime-Message-Forwarding

    35020

    iOS runtime swift swizzling

    iOS runtime swift的Swizzling方法交换 背景知识 Swift 是一种强类型语言。即默认类型是安全的静态类型。 纯Swift类的函数调用已经不再是OC的运行时发送消息,而是类似于C++的vtable,在编译时就确定了调用哪个函数,所以没法通过runtime获取方法,属性。 Swift的动态性可以通过OC运行时来获得,动态性最常用的就是方法替换(Method Swizzling)。 { UIApplication.runOnce return super.next } } /// swizzling协议 在需要交换方法的类遵循此协议,实现方法 protocol SelfAware: class { static func awake() } 实现:Person类遵从SelfAware协议并实现方法awake,在awake方法内实现runtime

    92721

    iOS runtime(实践篇)

    iOS runtime(基础篇) iOS runtime(理论篇) 前面2篇介绍了runtime一些概念。接下来看看runtime在实际开发中都有哪些使用。 1.消息机制 Person *p = [[Person alloc] init]; // 调用对象方法 [p eat]; // 本质:让对象发送消息 objc_msgSend(p, @selector

    44170

    iOS RunTime之六:Category

    runtime.h查看定义: typedef struct objc_category *Category; 同样也是一个 objc_category 结构体,定义如下: struct objc_category ; } OBJC2_UNAVAILABLE; 打开 objc 源代码,在objc-runtime-new.h cls:要扩展的类对象,编译期间是不会定义的,而是在Runtime阶段通过name对应到对应的类对象。 instanceMethods:category中所有给类添加的实例方法的列表。 Category的原理 想深入了解 Category 的原理,请查看苹果的源码,这里是 objc4-680/ 我们知道,Objective-C 的运行是依赖 runtime,而 runtime 则依赖于 在这里分了两种情况进行处理:Category 的实例方法和属性被整合到主类;而类方法则被整合到元类。另外,对协议的处理比较特殊,Category 的协议被同时整合到了主类和元类

    37420

    iOS进阶之runtime作用

    苹果和GNU各自维护一个开源的runtime版本,这两个版本之间都在努力的保持一致。 Objective-C 从三种不同的层级上与 Runtime 系统进行交互,分别是通过 Objective-C 源代码,通过 Foundation 框架的NSObject类定义的方法,通过对 runtime 大部分情况下你就只管写你的Objc代码就行,runtime 系统自动在幕后辛勤劳作着。 1、概念 RunTime简称运行时,就是系统在运行的时候的一些机制,其中最主要的是消息机制。 ? 、ios进阶之传递消息 ? 如果我们将每个方法都直接加到内存当中去,但是几百年不用一次,这样就造成了浪费,所有采取动态添加 6.实现字典和模型的自动转换 3、详解: 一、动态交换方法 1.在自定义类DWExchangeTwoMethod.m

    43190

    iOS离屏渲染触发机制iOS离屏渲染触发机制

    iOS系统离屏渲染利与弊 阅读需要约8分钟 前言 性能的优化相信是每一个APP工程师所追求的,而离屏渲染就是一个绕不开的知识点。 需要在额外的内存完成多图层组合绘制工作 GPU的离屏渲染 现在我对上图中增加一个圆角,而上图是由3个图层组成的,且图层渲染到画布后就会被销毁,导致GPU没办法一次性拿到所有图层来进行圆角切割. CPU的“离屏渲染” 在CoreAnimation 渲染流程Display流程的视图层绘制中提过,如果开启drawRect:方法就会触发CPU的“离屏渲染”,该方法里的所有代码都是在CPU中进行执行 ,知道完成bitmap,转存到帧缓存区。 推荐阅读: 极客技术团队-关于iOS离屏渲染的深入研究

    77130

    iOSruntime的简单用法——动态绑定

    先说需求:在tableView每一行有一个删除按钮,点击删除当前行。 可是如果你细心会发现,runtime有个很大的好处就是你不需要再费劲找目标对象了。只需要 1 绑定。2 取出。用法简单又霸道... 机制 首先 #import <objc/runtime.h> //绑定 objc_setAssociatedObject(cell.deleteButton, deleteButtonKey 机制 //取出 NSIndexPath *indexPath = objc_getAssociatedObject(button, deleteButtonKey); [self.dataList iOS技术交流群:511860085 成堆的技术视频福利,欢迎加入! 最后上传个效果图 ? ?

    62450

    iOS runtime探究(二): 从runtime开始深入理解OC消息转发机制你要知道的runtime都在这里

    ,可自行选择需要了解的方向: 从runtime开始: 理解面向对象的类到面向过程的结构体 从runtime开始: 深入理解OC消息转发机制runtime开始: 理解OC的属性property 从runtime 开始: 实践Category添加属性与黑魔法method swizzling 从runtime开始: 深入weak实现机理 本文是系列文章的第二篇文章从runtime开始: 深入理解OC消息转发机制,主要从 runtime出发讲解OC的消息传递和消息转发机制。 OC里的消息传递采用动态绑定机制来决定具体调用哪个方法,OC的实例方法在转写为C语言后实际就是一个函数,但是OC并不是在编译期决定调用哪个函数,而是在运行期决定,因为编译期根本不能确定最终会调用哪个函数 这就涉及到前一篇博客讲解的内容iOS runtime探究(一): 从runtime开始: 理解面向对象的类到面向过程的结构体,这一篇博客详细讲解了OC的runtime是如何将面向对象的类映射为面向过程的结构体的

    53270

    iOS RunTime之一:简介

    Objective-C是基于C语言加入了面向对象特性和消息转发机制的动态语言,这意味着它不仅需要一个编译器,还需要Runtime系统来动态创建类和对象,执行编译的代码,进行消息发送和转发。 Objective-C的Runtime其实是一个Runtime库,它基本上是用C和汇编写的,这个库使得C语言有了面向对象的能力。 下面通过分析Apple开源的Runtime代码来深入理解Objective-C的Runtime机制。 后来对Runtime的理解慢慢增加了,逐渐明白了[object doSomething]的含义。

    24310

    iOS开发--runtime常用API

    object_getClassName 获取对象的类名 object_getClass 获取对象的Class object_setClass 设置对象的Class object_getIvar 获取对象实例变量的值 object_setIvar 设置对象实例变量的值 object_getInstanceVariable 获取对象实例变量的值 (ARC无效,使用object_getIvar) object_setInstanceVariable 设置对象实例变量的值 (ARC无效,使用object_setIvar) 4.method_xxx 系列函数 method_系列函数关注于方法内部,如果方法的参数及返回值类型和方法的实现 method_getName 注册方法 sel_isEqual 判断方法是否相等 9.imp_xxx 系列函数 imp_implementationWithBlock 通过代码块创建IMP imp_getBlock 获取函数指针的代码块 imp_removeBlock 移除IMP的代码块

    24240

    iOS开发利用runtime设置UITextView的默认文字

    今天在看别人的博客的时候发现了UITextField有一个placeholderLabel的属性,这个属性是UITextView的私有属性,我们可以通过runtime访问该属性。

    23120

    相关产品

    • 移动推送

      移动推送

      移动推送TPNS(原信鸽)为应用提供合法合规、消息通道稳定、消息高效秒达、全球服务覆盖的消息推送服务,已稳定服务腾讯游戏、腾讯视频等超高日活应用;支持App推送、应用内消息、智能短信等多种消息类型,有效提升用户活跃度。

    相关资讯

    热门标签

    活动推荐

    扫码关注腾讯云开发者

    领取腾讯云代金券