简述下Objective-C中调用方法的过程(runtime)

  • Objective-C是动态语言,每个方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver, selector),整个过程介绍如下:

    • objc在向一个对象发送消息时,runtime库会根据对象的isa指针找到该对象实际所属的类
    • 然后在该类中的方法列表以及其父类方法列表中寻找方法运行
    • 如果,在最顶层的父类(一般也就NSObject)中依然找不到相应的方法时,程序在运行时会挂掉并抛出异常unrecognized selector sent to XXX
    • 但是在这之前,objc的运行时会给出三次拯救程序崩溃的机会,这三次拯救程序奔溃的说明见问题《什么时候会报unrecognized selector的异常》中的说明
  • 补充说明:Runtime 铸就了Objective-C 是动态语言的特性,使得C语言具备了面向对象的特性,在程序运行期创建,检查,修改类、对象及其对应的方法,这些操作都可以使用runtime中的对应方法实现。
时间: 2024-08-22 13:01:52

简述下Objective-C中调用方法的过程(runtime)的相关文章

Lua中“.”调用方法与“:”调用方法的区别

Lua中"."调用方法与":"调用方法的区别:                                                                                                                         一.概述 学lua的时候有一个迷惑点,就是搞不清楚'.'与':'调用方法的区别,今天很早就起来看了看一个大牛的视频讲解,才顿悟了:'.'调用和':'实际是传递参数的个数不同而已,':

java-动态绑定-调用方法的过程

先上代码 package com.ray.testobject; /** * 调用方法的过程 * * @author ray * @since 2015-05-01 * */ public class Person { public void say() { System.out.println("i am a person"); } public void say(int age) { System.out.println("i am " + age); } pu

C#中调用方法的示例

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace W3C_APP_Demo { class Program { public int FindMax(int num1, int num2) { /* 局部变量声明 */ int result; if (num1 > num2) result = n

不同情况下元素局中的方法

一.居中元素定宽定高情况 .fu{ width: 500px; height: 500px; border:1px solid #000; } .kuangao{ width: 100px; height: 50px; background-color: red; } <div class="fu"> <div class="kuangao"></div> </div> 1.水平局中: 方法一: 利用自动外边距 .ku

使用dubbo引用和发布服务时出现的异常:HTTP状态500 - 请求处理失败; 嵌套异常是com.alibaba.dubbo.rpc.RpcException:无法在服务cn.e3mall.service.ItemService中调用方法getTbItemById。使用dubbo版本2.5.3在消费者...

异常情况如下: 从异常看,主要是因为TbItem没有序列化: 分析问题: 表现层调用服务端时返回了一个TbItem对象即Java对象,此时这个对象远程调用拿过来必须进行序列化,要进行网络传输必须先要把对象序列化,再通过流传到引用端(表现层),传到表现层后再进行反序列化,再变成Java对象,所以TbItem对象必须实现序列化接口 原文地址:https://www.cnblogs.com/rgever/p/10279940.html

xml中定义个TextView控件及java代码中调用方法。

<TextView         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="@string/hello_world"         android:id="@+id/myTextView" /> TextView myTextView = (Text

asp.net后台cs中的JSON格式变量在前台Js中调用方法

//后台cs代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class Login_jg : System.Web.UI.Page { protected void Page_Load(object sender, EventArg

Mac下使用Eclipse实现Android中调用C/C++(NDK)基础详细教程

写于2014年那个办公室停电导致热爆了汗流浃背的夏天. 吐槽和需求 果然跟po主用之前猜的差不多,eclipse不愧是po主非常非常没有猿粪的开发工具,po主简直已经无力吐槽了,为什么稳定性这么糟糕的东西居然还能被如此多大牛开发者甘之如饴?一群叫嚣着要开发出世界上最人性化UI的人连自己用的工具都不稳定(人性化?呵呵),就像一个拿着漏勺烂锅残口菜刀的乞丐跟你说他能做世界上最好的叫花鸡一样--你信吗?当然,厨师可以不会(一般也不)生产菜刀,生产菜刀的也不一定是厨师,但起码要能分辨出好的菜刀:开发者可

****Objective-C 中的方法的调用

oc语言中采用特定的语言调用类或者实例(对象)的方法称为发送消息或者方法调用. oc中方法的调用有两种: 第一种: [类名或对象名 方法名]; [ClassOrInstance method]; [ClassOrInstance method:arg1]; [ClassOrInstance method1:arg2 method2:arg2]; [[ClassOrInstance method:arg1] otherMethod]; //嵌套发送消息 第二种: 对象名.方法名;    (点语法)