Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS消息机制相关

iOS消息机制相关

作者头像
我只不过是出来写写代码
发布于 2019-04-02 06:58:10
发布于 2019-04-02 06:58:10
1.5K00
代码可运行
举报
运行总次数:0
代码可运行
  1. OC中给nil对象发送消息程序是否会crash?

OC想nil发送消息,是不会崩溃的。

OC的函数调用都是通过objc_msgSend进行消息发送来实现,相对于C/C++来说,操作空指针引起crash问题,objc_msgSend通过判断self来决定是否发送消息,self为nil,那么selector也为空,直接返回,所以不会崩溃。向nil发消息可能会返回nil(对象)、0(基础数据类型)或0x0(id类型),但对[NSNull null]对象发消息时,会造成crash,因为NSNull类只有一个null方法。若对象已被释放,引用计数为0,去调用方法肯定也会crash,访问了野指针。那么,安全的做法就是将释放的对象置为nil,变为空指针。

小tips:

在使用一个对象前判断它是否为nil,好处:1.降低时间复杂度,当为nil就不需要对其发送消息,节省资源 2.切换语言时不容易出错

关于nil,定义为null pointer to object-c class,指的是一个类指针为空,本质是(class)0,OC类的字面为零值。

关于null,定义为null pointer to primitive type or absence of data,指的是一般基础数据类型为空,可以给任意指针赋值,本质是(void *)0,是C指针的字面0值。尽量不用null初始化OC对象,null主要针对基础数据类型。

关于NSNull,包含了唯一方法+(NSNull *)null,是一个对象,用于表示零值的单独对象。主要用于不能使用nil的场景下,例如可变数组中,想插入一个空对象时。

  1. objc向一个对象发送消息[obj foo]和objc_msgSend()函数之间有什么关系? objc_msgSend()是[obj foo]的具体实现。在动态编译时,[obj foo]会被转意为:objc_msgSend(obj, @selector(foo)) 先去obj对应的类中找方法;找缓存,找不到时去找方法列表;再找父类,以此向上传递;最后找不到则转发。
  2. 什么情况会报unrecognized selector异常? 调用某个对象方法时,当前类中无此方法,那么去父类查找,向上直到NSObject。若依旧找不到,则会报此错误。 若没有实现某个方法时,会调用_objc_msgForward进行方法转发。方法对应的IMP没找到,会返回该函数的IMP去执行。 在崩溃前,objc运行时会给出三次拯救崩溃的机会

+(bool)resolveInstanceMethod:(sel){

//第一次找不到时,会自动调用该方法,用来给程序添加一个新方法并执行

}

-(id)forwardingTargetForselector:(sel)aselctor{

//当系统调用上一个方法后未能实现添加新方法,这是系统提供一个将SEL转给其他对象的机会

}

  • (NSMethodSigature *)methodSignatrueForseletor:(sel)aselector{

//当上一个方法返回nil或self时,进入该方法,返回一个方法签名,并由forwardInvocation:去执行

}

-(void)forwardInvocation:(NSInvocation *)anInvocation{

//若上面方法不返回nil,则在这里调用自己对象的其他方法,也可以调用其它函数,以及多个不同对象的多个方法

}

  1. 一个objc对象如何进行内存布局?(有父类时) 所有的父类成员变量以及自己的都会存放在对象所对应的存储空间中 每个对象都有一个isa指针,指向他的类对象,类对象中存放着本身对象的方法列表;成员变量的列表;属性列表。类对象内容也有一个isa指针指向元对象,元对象内部存放的是类方法列表,类对象有一个superclass指针,指向父类对象。 根对象是NSObject,superclass指针指向nil

类对象也是示例,也有一个isa指针指向他的元类,即类对象的元类实例,元类内部存放的是类方法列表,根元类的isa指针指向自己,superclass指针指向NSObject类。

  1. objc类方法与实例方法的本质区别以及联系 类方法:

类方法属于类对象;

类方法只能通过类对象调用;

类方法中的self是类对象;

类方法中不能访问成员变量;

类方法可以调用其他的类方法;

类方法中不能直接调用对象方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
实例方法:

实例方法是属于实例对象的;

实例方法只能通过实例对象调用;

实例方法中self是实例对象;

实例方法中可以访问成员变量;

可直接调用实例方法;

可直接调用类方法

  1. 一个objc对象的isa指针指向什么?作用?

指针查找

对象的isa指向类,类的isa指向元类(也是类,也是对象),元类isa指向元类的根类,最终根元类的isa指向它本身,形成一个封闭的内循环。isa是帮助一个对象找到他的方法。

  1. _objc_msgForward函数作用,直接调用将会发生什么?

当对象没有实现某个方法时,会调用该函数进行方法转发。

直接调用该方法,就算实现了要调用的方法,也不会被调用,会直接走消息转发步骤

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.05.24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入浅出 Runtime(六):相关面试题
目的是将实例和类的相关方法列表以及构建信息区分开来,方便各司其职,符合单一职责设计原则。
师大小海腾
2020/04/16
7320
深入浅出 Runtime(六):相关面试题
iOS开发·runtime原理与实践: 基本知识篇(类,超类,元类,super_class,isa,对象,方法,SEL,IMP)
Tips:苹果公开的源代码在这里可以查,https://opensource.apple.com/tarballs/
陈满iOS
2018/09/10
1.8K1
iOS开发·runtime原理与实践: 基本知识篇(类,超类,元类,super_class,isa,对象,方法,SEL,IMP)
NSObject头文件解析 / 消息机制 / Runtime解读 (一)
上面是NSObject对象的头文件类部分, 可以看到还有一个NSObject protocol 我们也仔细看看都有什么协议方法@protocol NSObjec
周希
2019/10/15
1.3K0
runtime
作为iOS开发者,runtime特性是必须了解的重点加分项。这并不是说你可以说出消息机制,运行时消息重定向,或者利用runtime特性实现交换方法等,而是更应该深入了解其原理,"知其然且知其所以然"才能不断成长。 Object-C是面相运行时的语言(runtime oriented language),它将编译和链接时要执行的逻辑延迟到运行时来处理。相对静态语言,我们的代码更具灵活性,在苹果封闭链中这个特性也能帮助我们进行线上修复,例如业界鼎鼎大名的JSPatch(虽然现在苹果为了安全性,一封邮件“封杀”JSPatch)。那本篇文章先从runtime功能入手,让你体会runtime的强大,再介绍其原理。在此之前,先了解下基础知识。
sweet说好的幸福
2020/12/23
7560
OC-经典面试题分析(一)OC-经典面试题分析(一)
事实上这个方法并不会被调用,而是由llvm处理为调用objc_opt_isKindOfClass这个方法,具体可以打断点或者使用汇编的方式查看(猜测:方便做一些兼容)
用户8893176
2021/08/09
2990
OC-经典面试题分析(一)OC-经典面试题分析(一)
【API使用系列,整理】NSObject专题
http://blog.csdn.net/uxyheaven/article/details/38120335
江中散人_Jun
2022/03/08
2800
神经病院Objective-C Runtime住院第二天—消息发送与转发
现在越来越多的app都使用了JSPatch实现app热修复,而JSPatch 能做到通过 JS 调用和改写 OC 方法最根本的原因是 Objective-C 是动态语言,OC 上所有方法的调用/类的生成都通过 Objective-C Runtime 在运行时进行,我们可以通过类名/方法名反射得到相应的类和方法,也可以替换某个类的方法为新的实现,理论上你可以在运行时通过类名/方法名调用到任何 OC 方法,替换任何类的实现以及新增任意类。今天就来详细解析一下OC中runtime最为吸引人的地方。
一缕殇流化隐半边冰霜
2018/08/29
8000
神经病院Objective-C Runtime住院第二天—消息发送与转发
2020-iOS最新面试题解析—1(原理篇)
面试题持续整理更新中,如果你想一起进阶去大厂,不妨添加一下交流群1012951431
会写bug的程序员
2020/06/22
1.8K0
2020-iOS最新面试题解析—1(原理篇)
神经病院Objective-C Runtime入院第一天—isa和Class
我第一次开始重视Objective-C Runtime是从2014年11月1日,@唐巧老师在微博上发的一条微博开始。
一缕殇流化隐半边冰霜
2018/08/30
8380
神经病院Objective-C Runtime入院第一天—isa和Class
iOS 底层拾遗:objc_msgSend 与方法缓存
Runtime 消息发送与转发流程总是大家关注的重点,却常常忽略方法缓存机制这个显著提升 objc_msgSend 性能的幕后功臣。
波儿菜
2019/10/28
1.2K0
动态的Objective-C——关于消息机制与运行时的探讨
    Objective-C是一种很优美的语言,至少在我使用其进行编程的过程中,是很享受他那近乎自然语言的函数命名、灵活多样的方法调用方式以及配合IDE流顺畅快编写体验。Objective-C是扩展与C面向对象的编程语言,然而其方法的调用方式又和大多面向对象语言大有不同,其采用的是消息传递、转发的方式进行方法的调用。因此在Objective-C中对象的真正行为往往是在运行时确定而非在编译时确定,所以Objective-C又被称为是一种运行时的动态语言。
珲少
2018/08/15
8730
动态的Objective-C——关于消息机制与运行时的探讨
【IOS开发高级系列】Objective-c Runtime专题总结
http://yulingtianxia.com/blog/2014/11/05/objective-c-runtime/
江中散人_Jun
2023/10/16
4310
【IOS开发高级系列】Objective-c Runtime专题总结
Objective-C的对象模型和runtime机制「建议收藏」
对象(Object): OC中基本构造单元 (building block),用于存储和传递数据。
全栈程序员站长
2022/07/10
3810
Objective-C的对象模型和runtime机制「建议收藏」
深入浅出 Runtime(三):消息机制
在前面的文章说过,Runtime 是一个用C、汇编编写的运行时库。 在底层汇编里面如果需要调用 C 函数的话,苹果会为其加一个下划线_, 所以查看objc_msgSend函数的实现,需要搜索_objc_msgSend(objc-msg-arm64.s(objc4))。
师大小海腾
2020/04/16
8160
神经病院Objective-C Runtime住院第二天—消息发送与转发
现在越来越多的app都使用了JSPatch实现app热修复,而JSPatch 能做到通过 JS 调用和改写 OC 方法最根本的原因是 Objective-C 是动态语言,OC 上所有方法的调用/类的生成都通过 Objective-C Runtime 在运行时进行,我们可以通过类名/方法名反射得到相应的类和方法,也可以替换某个类的方法为新的实现,理论上你可以在运行时通过类名/方法名调用到任何 OC 方法,替换任何类的实现以及新增任意类。今天就来详细解析一下OC中runtime最为吸引人的地方。
一缕殇流化隐半边冰霜
2024/02/11
2970
神经病院Objective-C Runtime住院第二天—消息发送与转发
iOS 开发:『Runtime』详解(一)基础知识
我们都知道,将源代码转换为可执行的程序,通常要经过三个步骤:编译、链接、运行。不同的编译语言,在这三个步骤中所进行的操作又有些不同。
程序员充电站
2019/06/13
1.5K0
面经之《招聘一个靠谱的iOS》import "CYLBlockExecutor.h"import "CYLBlockExecutor.h"import "CYLNSObject+RunAtDeallo
什么情况使用 weak 关键字,相比 assign 有什么不同? 什么情况使用 weak 关键字? 在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: de
rectinajh
2018/05/17
1.1K0
iOS-RunTime,不再只是听说
一. RunTime简介 RunTime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消息机制。 对于C语言,函数的调用在编译的时候会决定调用哪个函数,如果调用未实现的函数就会报错。 对于OC语言,属于动态调用过程,在编译的时候并不能决定真正调用哪个函数,只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。在编译阶段,OC可以调用任何函数,即使这个函数并未实现,只要声明过就不会报错。 二. RunTime消息机制 消息机制是运行时里面最重要的机制,OC中任何方法的调用,
xx_Cc
2018/05/10
1.4K0
Objective-C Runtime详解
Objective-C Runtime 最近在学习Runtime的知识,恰巧发现了这篇博客《Objective-C Runtime》,在此基础上,进行了些许补充说明,如有错误或其他想法,欢迎提出交流。 目录 引言 简介 与Runtime交互 RunTime术语 消息 动态方法解析 消息转发 健壮的实例变量 动态添加属性(Object-C Associated Objects) 方法调剂(Method Swizzling) 总结 引言 Objective-C的方法调用实则为“发送消息”,我们来看[dog
BY
2018/05/11
1.9K0
iOS底层原理总结 - 探寻Runtime本质(三)
方法调用的本质 本文我们探寻方法调用的本质,首先通过一段代码,将方法调用代码转为c++代码查看方法调用的本质是什么样的。 xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m [person test]; // --------- c++底层代码 ((void (*)(id, SEL))(void *)objc_msgSend)((id)person, sel_registerName("test")); 通过上述源码可以看出c++底层代码
xx_Cc
2018/07/03
5560
推荐阅读
相关推荐
深入浅出 Runtime(六):相关面试题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验