iOS 的类
文章平均质量分 88
类是面向对象的基础,iOS的类不仅是实现面向对象,还有一些值得关注的特性与原理。
Z苗
这个作者很懒,什么都没留下…
展开
-
objc_msgSend流程分析之 动态方法决议 / 消息转发
在前面两篇文章iOS-底层原理 objc_msgSend流程分析之慢速查找和objc_msgSend流程分析之缓存查找,分别分析了objc_msgSend的快速查找和慢速查找,在这两种都没找到方法实现的情况下,苹果给了两个建议动态方法决议:慢速查找流程未找到后,会执行一次动态方法决议消息转发:如果动态方法决议仍然没有找到实现,则进行消息转发方法未实现报错详解报错如图方法未实现报错源码根据慢速查找的源码,我们发现,其报错最后都是走到**__objc_msgForward_impcache方法原创 2021-08-12 17:21:42 · 163 阅读 · 0 评论 -
objc_msgSend流程分析之慢速查找
在上一篇:objc_msgSend流程分析之快速查找文章中,我们分析了快速查找流程,如果快速查不到,则需要进入慢速查找流程,以下是慢速查找的分析过程原创 2021-08-12 14:52:45 · 161 阅读 · 0 评论 -
objc_msgSend流程分析之缓存查找
在上一篇文章:objc_class 中 cache 原理分析中,分析了cache的写入流程,在写入流程之前,还有一个cache读取流程,即objc_msgSend 和 cache_getImp在分析之前,首先了解什么是RuntimeRuntime 介绍原创 2021-08-12 10:48:36 · 202 阅读 · 0 评论 -
objc_class 中 cache 原理分析
isa与类关联的原理和类 & 类结构分析中,分析了objc_class中isa和bits,这篇文章主要是分析objc_calss中的cache属性源码初探1.打开objc4源码, 搜索objc_class2.点击进入cache_t2.1: 暂时剔除const、void、static和函数struct cache_t {#if CACHE_MASK_STORAGE == CACHE_MASK_STORAGE_OUTLINED//macOS、模拟器 -- 主要是架构区分 // ex原创 2021-08-11 16:17:52 · 180 阅读 · 0 评论 -
strong©&weak底层分析
在clang编译的cpp文件中可以发现strong & copy & weak 修饰的属性在编译的底层代码中是有区别的。探索在ZMPerson中我们定义了两个两个属性,分别用copy和strong修饰用clang将main.m文件编译成main.cpp,然后发现copy 和strong修饰的属性的set方法是有区别的这里就有疑问了,为什么copy修饰的属性使用了objc_setProperty,而strong修饰的没有?在LLVM中搜索”objc_setProperty,原创 2021-08-10 15:04:17 · 255 阅读 · 0 评论 -
类 & 类结构分析
类的原理分析类的原理分析主要是分析 isa以及 继承关系.从 isa 开始探索 - isa走位链在main中分别用两个定义以个对象:ZMPersonint main(int argc, char * argv[]) { @autoreleasepool { CJLPerson *person = [CJLPerson alloc]; } return 0;}isa的掩码 0x00007ffffffffff8ULL开启lldb调试,调试的过原创 2021-08-09 15:35:43 · 373 阅读 · 0 评论 -
isa与类关联的原理
alloc & init & new 源码分析文章中,alloc有3个核心操作,其中一个就是obj->initInstanceIsa,即类与isa绑定。主要理解类与isa是如何关联的。objc4中分析obj->initInstanceIsa源码找到obj->initInstanceIsa源码首先从alloc进入objc的源码,找到obj = (id)calloc(1, size);操作,涉及的方法顺序是alloc --> _objc_rootAlloc --&原创 2021-08-08 14:17:26 · 518 阅读 · 1 评论 -
alloc & init & new 源码分析
下载 objc4-781 源码案例 ZMPerson *p1 = [ZMPerson alloc]; ZMPerson *p2 = [p1 init]; ZMPerson *p3 = [p1 init];输出结果 p1 == 内容:<ZMPerson: 0x6000031c4520> - 内存地址:0x6000031c4520 - 指针地址:0x7ffee2660098 p 2== 内容:<ZMPerson: 0x6000031c4520> - 内存地址:0x60原创 2021-08-06 16:55:24 · 235 阅读 · 0 评论 -
1.3 类属性
我们知道,在实例方法中,self指的是类实例,而在类方法中, self指的是类,而不是类实例,一般情况下也是可以直接将self换成类名来调用。类实例是由类名来创建的,那类是怎么来的呢,类都是源自于一个叫元类。类可以看做其元类的实例,与此同时,我们再看objc 对象对应的结构体。struct objc_class {Class isa; // 指向所属类的指针(_Nonnull)Class super_class; // 父类const char *name; // 类名(_Nonnull)原创 2021-06-26 13:32:08 · 686 阅读 · 0 评论 -
1.2 类方法的self
引用上一篇文章,下面通过allocz 和initWithName的方式来创建Person对象原创 2021-06-19 11:50:48 · 675 阅读 · 0 评论 -
1.1 创建并描述一个类
1.1 创建并描述一个类开发经常需要创建类文件,可以说在项目开发过程中,很大一部分是由类组成的,要在Object-C创建一个类,需要继承NSObject或者子类,NSObject以及子类就是Object-C语言对象的实现。打开NSObject 的定义,可以看到其头文件中仅有一百多行代码,及定义了对象及其本方法。@interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY;}NSObject 其实是实现了同原创 2021-06-19 11:45:18 · 1071 阅读 · 0 评论