神秘的 isa 指针

「类与对象」说一说isa指针 概要 在讲isa指针前,我们先来看一道经典的面试题: 对象的isa指针指向哪里? 看到这道题,心中可能朦朦胧胧有些答案,也可能不太确定,抑或说不明白。那咱就带着这个问题,揭开isa指针的神秘面纱。 这篇文章主要就isa的作用、数据结构以及如何优化等方面进行讲解。 isa的作用 在文章NSObject对象的分类中,详细讲解了isa指针的指向、如何寻找实例方法和类方法以及如何通过isa指针找到类对象和元类对象的。 基本总结一下,instance对象的isa指向instance对象所对应的Class对象,Cla 阅读详情



> 因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 `x86_64` 架构下运行的,对于在 arm64 中运行的代码会特别说明。


如果你曾经对 ObjC 底层的实现有一定的了解,你应该会知道 **Objective-C 对象都是 C 语言结构体**,所有的对象都包含一个类型为  `isa` 的指针,那么你可能确实对 ObjC 的底层有所知,不过现在的 ObjC 对象的结构已经不是这样了。代替 `isa` 指针的是结构体 `isa_t`, 这个结构体中"包含"了当前对象指向的类的信息,这篇文章中会介绍一些关于这个变化的知识。


```objectivec

struct objc_object {

    isa_t isa;

};

```


当 ObjC 为为一个对象分配内存,初始化实例变量后,在这些对象的实例变量的结构体中的第一个就是 `isa`。


<p align='center'>

![objc-isa-class-object](../images/objc-isa-class-object.png)


> 所有继承自 `NSObject` 的类实例化后的对象都会包含一个类型为 `isa_t` 的结构体。


从上图中可以看出,不只是**实例**会包含一个 `isa` 结构体,所有的**类**也有这么一个 `isa`。在 ObjC 中 Class 的定义也是一个名为 `objc_class` 的结构体,如下:


```objectivec

struct objc_class : objc_object {

    isa_t isa;

    Class superclass;

    cache_t cache;

    class_data_bits_t bits;

};

```


> 由于 `objc_class` 结构体是继承自 `objc_object` 的,所以在这里显式地写出了 `isa_t isa` 这个成员变量。


## `isa` 指针的作用与元类


到这里,我们就明白了:**Objective-C 中类也是一个对象**。


这个 `isa` 包含了什么呢?回答这个问题之前,要引入了另一个概念 *元类(meta class)*,我们先了解一些关于元类的信息。


因为在 Objective-C 中,对象的方法并**没有存储于对象的结构体中**(如果每一个对象都保存了自己能执行的方法,那么对内存的占用有极大的影响)。


当**实例方法**被调用时,它要通过自己持有的 `isa` 来查找对应的类,然后在这里的 `class_data_bits_t` 结构体中查找对应方法的实现。同时,每一个 `objc_class` 也有一个**指向自己的父类的指针** `super_class` 用来查找继承的方法。


> 关于如何在 `class_data_bits_t` 中查找对应方法会在之后的文章中讲到。这里只需要知道,它会在这个结构体中查找到对应方法的实现就可以了。[深入解析 ObjC 中方法的结构](https://github.com/Draveness/iOS-Source-Code-Analyze/blob/master/objc/深入解析%20ObjC%20中方法的结构.md)


<p align='center'>

![objc-isa-class-pointer](../images/objc-isa-class-pointer.png)


但是,这样就有一个问题,类方法的实现又是如何查找并且调用的呢?这时,就需要引入*元类*来保证无论是类还是对象都能**通过相同的机制查找方法的实现**。


<p align='center'>

![objc-isa-meta-class](../images/objc-isa-meta-class.png)



让每一个类的 `isa` 指向对应的元类,这样就达到了使类方法和实例方法的调用机制相同的目的:


+ 实例方法调用时,通过对象的 `isa` 在类中获取方法的实现

+ 类方法调用时,通过类的 `isa` 在元类中获取方法的实现


下面这张图介绍了对象,类与元类之间的关系,笔者认为已经觉得足够清晰了,所以不在赘述。


<p align='center'>

![](../images/objc-isa-class-diagram.png)


> 图片来自 [objc_explain_Classes_and_metaclasses](http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html)


有关与介绍类与元类之间的关系的文章实在是太多了,因为这篇文章主要介绍 `isa`,在这一小节只是对其作用以及元类的概念进行介绍。如果想要了解更多关于类与元类的信息,可以看 [What is a meta-class in Objective-C?](http://www.cocoawithlove.com/2010/01/what-is-meta-class-in-objective-c.html)


## 结构体 `isa_t`


其实 `isa_t` 是一个定义得非常"奇怪"的结构体,在 ObjC 源代码中可以看到这样的定义:


```objectivec

#define ISA_MASK        0x00007ffffffffff8ULL

#define ISA_MAGIC_MASK  0x001f800000000001ULL

#define ISA_MAGIC_VALUE 0x001d800000000001ULL

#define RC_ONE   (1ULL<<56)

#define RC_HALF  (1ULL<<7)


union isa_t {

    isa_t() { }

    isa_t(uintptr_t value) : bits(value) { }


    Class cls;

    uintptr_t bits;


    struct {

        uintptr_t indexed           : 1;

        uintptr_t has_assoc         : 1;

        uintptr_t has_cxx_dtor      : 1;

        uintptr_t shiftcls          : 44;

        uintptr_t magic             : 6;

        uintptr_t weakly_referenced : 1;

        uintptr_t deallocating      : 1;

        uintptr_t has_sidetable_rc  : 1;

        uintptr_t extra_rc          : 8;

    };

};

```


> 这是在 `__x86_64__` 上的实现,对于 iPhone5s 等架构为 `__arm64__` 的设备上,具体结构体的实现和位数可能有些差别,不过这些字段都是存在的,可以看这里的 [arm64 上结构体的实现](#arm64)


**在本篇文章中, 我们会以 `__x86_64__` 为例进行分析,而不会对两种架构下由于不同的内存布局方式导致的差异进行分析**。在我看来,这个细节不会影响对 `isa` 指针的理解,不过还是要知道的。


笔者对这个 `isa_t` 的实现声明顺序有一些更改,更方便分析和理解。


```objectivec

union isa_t {

    ...

};

```


`isa_t` 是一个 `union` 类型的结构体,对 `union` 不熟悉的读者可以看这个 stackoverflow 上的[回答](http://stackoverflow.com/questions/252552/why-do-we-need-c-unions). 也就是说其中的 `isa_t`、`cls`、 `bits` 还有结构体共用同一块地址空间。而 `isa` 总共会占据 64 位的内存空间(决定于其中的结构体)


<p align='center'>

![objc-isa-isat](../images/objc-isa-isat.png)


```objectivec

struct {

   uintptr_t indexed           : 1;

   uintptr_t has_assoc         : 1;

   uintptr_t has_cxx_dtor      : 1;

   uintptr_t shiftcls          : 44;

   uintptr_t magic             : 6;

   uintptr_t weakly_referenced : 1;

   uintptr_t deallocating      : 1;

   uintptr_t has_sidetable_rc  : 1;

   uintptr_t extra_rc          : 8;

};

```


## `isa` 的初始化


我们可以通过 `isa` 初始化的方法 `initIsa` 来初步了解这 64 位的 bits 的作用:


```objectivec

inline void 

objc_object::initInstanceIsa(Class cls, bool hasCxxDtor)

{

    initIsa(cls, true, hasCxxDtor);

}


inline void 

objc_object::initIsa(Class cls, bool indexed, bool hasCxxDtor) 

{ 

    if (!indexed) {

        isa.cls = cls;

    } else {

        isa.bits = ISA_MAGIC_VALUE;

        isa.has_cxx_dtor = hasCxxDtor;

        isa.shiftcls = (uintptr_t)cls >> 3;

    }

}

```


### `indexed` 和 `magic`


当我们对一个 ObjC 对象分配内存时,其方法调用栈中包含了上述的两个方法,这里关注的重点是 `initIsa` 方法,由于在 `initInstanceIsa` 方法中传入了 `indexed = true`,所以,我们简化一下这个方法的实现:


```objectivec

inline void objc_object::initIsa(Class cls, bool indexed, bool hasCxxDtor) 

{ 

    isa.bits = ISA_MAGIC_VALUE;

    isa.has_cxx_dtor = hasCxxDtor;

    isa.shiftcls = (uintptr_t)cls >> 3;

}

```


对整个 `isa` 的值 `bits` 进行设置,传入 `ISA_MAGIC_VALUE`:


```objectivec

#define ISA_MAGIC_VALUE 0x001d800000000001ULL

```


我们可以把它转换成二进制的数据,然后看一下哪些属性对应的位被这行代码初始化了(标记为红色):


<p align='center'>

![objc-isa-isat-bits](../images/objc-isa-isat-bits.png)


从图中了解到,在使用 `ISA_MAGIC_VALUE` 设置 `isa_t` 结构体之后,实际上只是设置了 `indexed` 以及 `magic` 这两部分的值。


+ 其中 `indexed` 表示 `isa_t` 的类型

    + 0 表示 `raw isa`,也就是没有结构体的部分,访问对象的 `isa` 会直接返回一个指向 `cls` 的指针,也就是在 iPhone 迁移到 64 位系统之前时 isa 的类型。


    ```objectivec

    union isa_t {

        isa_t() { }

        isa_t(uintptr_t value) : bits(value) { }

    

        Class cls;

        uintptr_t bits;

    };

    ```


    + 1 表示当前 `isa` 不是指针,但是其中也有 `cls` 的信息,只是其中**关于类的指针都是保存在 `shiftcls` 中**。


    ```objectivec

    union isa_t {

        isa_t() { }

        isa_t(uintptr_t value) : bits(value) { }

    

        Class cls;

        uintptr_t bits;

    

        struct {

            uintptr_t indexed           : 1;

            uintptr_t has_assoc         : 1;

            uintptr_t has_cxx_dtor      : 1;

            uintptr_t shiftcls          : 44;

            uintptr_t magic             : 6;

            uintptr_t weakly_referenced : 1;

            uintptr_t deallocating      : 1;

            uintptr_t has_sidetable_rc  : 1;

            uintptr_t extra_rc          : 8;

        };

    };

    ```

+ `magic` 的值为 `0x3b` 用于调试器判断当前对象是真的对象还是没有初始化的空间


### `has_cxx_dtor`


在设置 `indexed` 和 `magic` 值之后,会设置 `isa` 的 `has_cxx_dtor`,这一位表示当前对象有 C++ 或者 ObjC 的析构器(destructor),如果没有析构器就会快速释放内存。


```objectivec

isa.has_cxx_dtor = hasCxxDtor;

```


<p align='center'>

![objc-isa-isat-bits-has-css-dto](../images/objc-isa-isat-bits-has-css-dtor.png)


### `shiftcls`


在为 `indexed`、 `magic` 和 `has_cxx_dtor` 设置之后,我们就要将当前对象对应的类指针存入 `isa` 结构体中了。


```objectivec

isa.shiftcls = (uintptr_t)cls >> 3;

```


> **将当前地址右移三位的主要原因是用于将 Class 指针中无用的后三位清除减小内存的消耗,因为类的指针要按照字节(8 bits)对齐内存,其指针后三位都是没有意义的 0**。

> 

> 绝大多数机器的架构都是 [byte-addressable](https://en.wikipedia.org/wiki/Byte_addressing) 的,但是对象的内存地址必须对齐到字节的倍数,这样可以提高代码运行的性能,在 iPhone5s 中虚拟地址为 33 位,所以用于对齐的最后三位比特为 `000`,我们只会用其中的 30 位来表示对象的地址。 



而 ObjC 中的类指针的地址后三位也为 0,在 `_class_createInstanceFromZone` 方法中打印了调用这个方法传入的类指针:


<p align='center'>

![objc-isa-print-cls](../images/objc-isa-print-cls.png)


可以看到,这里打印出来的**所有类指针十六进制地址的最后一位都为 8 或者 0**。也就是说,类指针的后三位都为 0,所以,我们在上面存储 `Class` 指针时右移三位是没有问题的。


```objectivec

isa.shiftcls = (uintptr_t)cls >> 3;

```


如果再尝试打印对象指针的话,会发现所有对象内存地址的**后四位**都是 0,说明 ObjC 在初始化内存时是以 16 个字节对齐的, 分配的内存地址后四位都是 0。 


<p align='center'>

![objc-isa-print-object](../images/objc-isa-print-object.png)


> 使用整个指针大小的内存来存储 `isa` 指针有些浪费,尤其在 64 位的 CPU 上。在 `ARM64` 运行的 iOS 只使用了 33 位作为指针(与结构体中的 33 位无关,Mac OS 上为 47 位),而剩下的 31 位用于其它目的。类的指针也同样根据字节对齐了,每一个类指针的地址都能够被 8 整除,也就是使最后 3 bits 为 0,为 `isa` 留下 34 位用于性能的优化。

> 

> Using an entire pointer-sized piece of memory for the isa pointer is a bit wasteful, especially on 64-bit CPUs which don't use all 64 bits of a pointer. ARM64 running iOS currently uses only 33 bits of a pointer, leaving 31 bits for other purposes. Class pointers are also aligned, meaning that a class pointer is guaranteed to be divisible by 8, which frees up another three bits, leaving 34 bits of the isa available for other uses. Apple's ARM64 runtime takes advantage of this for some great performance improvements.

> from [ARM64 and You](https://www.mikeash.com/pyblog/friday-qa-2013-09-27-arm64-and-you.html)


我尝试运行了下面的代码将 `NSObject` 的类指针和对象的 `isa` 打印出来,具体分析一下


<p align='center'>

![objc-isa-print-class-object](../images/objc-isa-print-class-object.png)


```

object_pointer: 0000000001011101100000000000000100000000001110101110000011111001 // 补全至 64 位

class_pointer:                                 100000000001110101110000011111000

```


> 编译器对直接访问 `isa` 的操作会有警告,因为直接访问 `isa` 已经不会返回类指针了,这种行为已经被弃用了,取而代之的是使用 [ISA()](#ISA()) 方法来获取类指针。


代码中的 `object` 对象的 `isa` 结构体中的内容是这样的:


![objc-isa-isat-class-highlight-bits](../images/objc-isa-isat-class-highlight-bits.png)



其中红色的为**类指针**,与上面打印出的 `[NSObject class]` 指针右移三位的结果完全相同。这也就验证了我们之前对于初始化 `isa` 时对 `initIsa` 方法的分析是正确的。它设置了 `indexed`、`magic` 以及 `shiftcls`。


### <a id='ISA()'></a>ISA() 方法


因为我们使用结构体取代了原有的 isa 指针,所以要提供一个方法 `ISA()` 来返回类指针。


其中 `ISA_MASK` 是宏定义,这里通过掩码的方式获取类指针:


```objectivec

#define ISA_MASK 0x00007ffffffffff8ULL

inline Class 

objc_object::ISA() 

{

    return (Class)(isa.bits & ISA_MASK);

}

```


### 其它 bits


在 `isa_t` 中,我们还有一些没有介绍的其它 bits,在这个小结就简单介绍下这些 bits 的作用


+ `has_assoc`

    + 对象含有或者曾经含有关联引用,没有关联引用的可以更快地释放内存

+ `weakly_referenced`

    + 对象被指向或者曾经指向一个 ARC 的弱变量,没有弱引用的对象可以更快释放

+ `deallocating`

    + 对象正在释放内存

+ `has_sidetable_rc`

    + 对象的引用计数太大了,存不下

+ `extra_rc`

    + 对象的引用计数超过 1,会存在这个这个里面,如果引用计数为 10,`extra_rc` 的值就为 9


```objectivec

struct {

   uintptr_t indexed           : 1;

   uintptr_t has_assoc         : 1;

   uintptr_t has_cxx_dtor      : 1;

   uintptr_t shiftcls          : 44;

   uintptr_t magic             : 6;

   uintptr_t weakly_referenced : 1;

   uintptr_t deallocating      : 1;

   uintptr_t has_sidetable_rc  : 1;

   uintptr_t extra_rc          : 8;

};

```


### <a id='arm64'></a>arm64 架构中的 `isa_t` 结构体


```objectivec

#define ISA_MASK        0x0000000ffffffff8ULL

#define ISA_MAGIC_MASK  0x000003f000000001ULL

#define ISA_MAGIC_VALUE 0x000001a000000001ULL

#define RC_ONE   (1ULL<<45)

#define RC_HALF  (1ULL<<18)

union isa_t {

    isa_t() { }

    isa_t(uintptr_t value) : bits(value) { }


    Class cls;

    uintptr_t bits;


    struct {

       uintptr_t indexed           : 1;

       uintptr_t has_assoc         : 1;

       uintptr_t has_cxx_dtor      : 1;

       uintptr_t shiftcls          : 33;

       uintptr_t magic             : 6;

       uintptr_t weakly_referenced : 1;

       uintptr_t deallocating      : 1;

       uintptr_t has_sidetable_rc  : 1;

       uintptr_t extra_rc          : 19;

    };

};

```


## 参考资料


+ [Objective-C Runtime Programming Guide](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtHowMessagingWorks.html)

+ [What is a meta-class in Objective-C?](http://www.cocoawithlove.com/2010/01/what-is-meta-class-in-objective-c.html)

+ [objc_explain_Classes_and_metaclasses](http://www.sealiesoftware.com/blog/archive/2009/04/14/objc_explain_Classes_and_metaclasses.html)

+ [Storing things in isa](http://stackoverflow.com/questions/18997362/storing-things-in-isa)

+ [Why do we need C Unions?](http://stackoverflow.com/questions/252552/why-do-we-need-c-unions)

+ [objc_explain_Non-pointer_isa](http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html)

+ [Tagged Pointer](https://en.wikipedia.org/wiki/Tagged_pointer)

+ [ARM64 and You](https://www.mikeash.com/pyblog/friday-qa-2013-09-27-arm64-and-you.html)

+ [64位与Tagged Pointer](http://blog.xcodev.com/posts/tagged-pointer-and-64-bit/)


Follow: [@Draveness](https://github.com/Draveness)


【嵌入式】指针与整数的桥梁、跨平台编程的黄金钥匙:揭开 uintptr_t 和 intptr_t 的神秘面纱 指针与整数的桥梁、跨平台编程的黄金钥匙:揭开 uintptr_t 和 intptr_t 的神秘面纱 阅读详情

相关推荐

从并行端口到ISA总线:用万用表和LED调试古董计算机接口的5个实战技巧

本文分享了5个使用万用表和LED调试古董计算机ISA总线接口的实战技巧,包括硬件工具选择、地址解码策略、总线冲突处理、时钟信号评估及典型故障案例分析。通过基础工具的组合应用,帮助复古计算爱好者有效解决ISA总线开发中的常见问题,特别适合硬件调试入门者学习。

weixin_42543046的博客 315

iOS对象内存结构中的 isa 指针是用来做什么的?

Objective-C 是一门面向对象的编程语言。每一个对象都是一个类的实例。在 Objective-C 语言的内部,每一个对象都有一个名为 isa 的指针,指向该对象的类。每一个类描述了一系列它的实例的特点,包括成员变量的列表,成员函数的列表等。每一个对象都可以接受消息,而对象能够接收的消息列表是保存在它所对应的类中。 在 Xcode 中按Shift + Command + O, 然后

ANDY_GUO_wei的专栏 2848

Python_构建同花顺问财智能选股API服务

本文详细介绍了如何使用Python构建同花顺问财智能选股API服务,涵盖从环境准备、核心API开发到高级功能扩展的全过程。通过Flask框架和pywencai库,开发者可以快速搭建稳定可靠的选股接口,实现自动化股票筛选与交易系统集成,提升量化投资效率。

weixin_30596343的博客 328

位域-isa指针

一、isa指针结构 union isa_t { isa_t() { } isa_t(uintptr_t value) : bits(value) { } Class cls; uintptr_t bits; #if SUPPORT_PACKED_ISA // extra_rc must be the MSB-most field (so it matches carry/overflow flags) // nonpointer must ...

cnmeimei的博客 2690

lattice 黑盒子的生成和使用(Creating Your Own Black Box Modules)

很多客户,特别是外包项目,需要做黑盒子,防止他人看到源码,那么这就需要对相关的源码打包加封了。diamond help 说的也是模糊模糊的,这次给出实际验证过的流程。 1.先将要加封的模块间一个工程,建好工程,写好代码之后,模块名字叫做crosslink(这个使用黑盒子的时候要用),代码如下: module crosslink( output wire[3:0] led, input wire clk, input wire reset ); reg [29:0] cnt; reg [3:0] led1;

qq_39633876的博客 1480

别再被骚扰了!手把手教你彻底卸载阿里云盾(安骑士)并封禁其IP段

本文详细指导如何彻底卸载阿里云盾(安骑士)并封禁其IP段,帮助用户夺回服务器控制权。从识别监控组件到执行官方卸载脚本,再到手动清理残留文件和配置iptables规则,确保完全阻断云盾通信。适用于追求极致性能或需要完全自主控制的环境。

weixin_42525551的博客 450

isa指针使用详情

isa指针使用详情

eastWind1101的博客 557

工业级RFID读写器|识读器CK-LR08-E00通过以太网TCPIP自由协议与汇川PLC控制器联机与通讯实例方案

本文以工业级RFID读写器CK-LR08-E00和汇川PLC控制器H5U是实例介绍工业级RFID读写器CK-LR08-E00通过以太网TCPIP自由协议与汇川PLC控制器联机与通讯方案。

华翔天诚科技 4370

iOS -- isa指针

isa指针

cyberjack的博客 2653

100多台物理GPU服务器,每台服务器上有8张GPU卡,组网

计算网用 IB/RoCEv2 保证低延迟高带宽,支撑 800+GPU 的分布式训练;管理网和存储网独立部署,避免干扰核心通信;全链路冗余和规范布线,确保集群稳定运行;搭配 Slurm/K8s 和监控工具,实现高效管理。该方案可支撑千亿参数大模型训练,且具备极强的扩展性,未来可平滑扩容至 200 + 台服务器。

weixin_42795092的博客 2020

CTF全能工具箱ProV2:集成AI与94GB离线资源库,打造无网环境下的智能解题流水线

CTF全能工具箱ProV2是一款专为线下CTF比赛设计的All-in-One离线解决方案。它集成了94GB的庞大离线资源库,涵盖Web、逆向、Pwn等全方向工具链与知识库,并创新性地内置了本地AI大模型,可在断网环境下提供智能解题辅助,实现从信息收集到漏洞利用的智能流水线作业,极大提升比赛效率。

weixin_29240343的博客 422

Runtime源码 类、对象、isa

OC做为一门动态语言,runtime是其最大的特点,它是一套底层的 C 语言 API,是 iOS 系统的核心之一。开发者在编码过程中,可以给任意一个对象发送消息,在编译阶段只是确定了要向接收者发送这条消息,而接受者将要如何响应和处理这条消息,那就要看运行时来决定了。在日常开发过程中类、对象、属性算是最常见的了,今天以对象为切入点,分析一下对象和类在runtime层面的表示。 类 类在runtime...

weixin_33716154的博客 244

XGBoost的简单安装及入门使用

XGBoost安装及简单入门 XGBoost支持多种操作系统,如Windows, Linux, MacOS等,并支持多种语言版本,如Python, R, Scale, Java等。XGBoost的安装方式一般有两种,一种是直接通过pip安装(适合用于Python),另外一种是通过源码编译安装 1、通过pip安装 通过pip安装Python包既简单又方便,只需执行如下的命令: pip install -i https://pypi.tuna.tsinghua.edu.cn/simple xgboost 使用

qq_41513230的博客 3万+

深入浅出 iOS 对象模型:isa 指针 与 Swift Metadata

在iOS开发中,isa指针和Metadata是两个关键概念,分别源自Objective-C和Swift的对象系统。isa指针是Objective-C对象的“身份证”,指向其类对象,支持动态消息发送和运行时方法调度。Swift的Metadata则描述了类型的详细信息,如类名、方法表等,支持静态和动态方法调度。两者在内存效率和方法调用上各有优势,isa指针在64位系统中通过合并结构节省内存,而Metadata通过只读共享减少全局开销。在混合开发中,继承自NSObject的Swift类会同时拥有isa指针和Met

u010130947的专栏 1222

置换矩阵、转置矩阵以及向量空间、子空间

置换矩阵、转置矩阵以及向量空间、子空间导读置换矩阵 导读 MIT矩阵分析课程之后的的二篇笔记。

qq_44677482的博客 1672

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

iOS底层探索之类的结构(上):ISA

回顾 在之前的几篇博客里面,我们知道了对象的本质是结构体(iOS底层探索之对象的本质和类的关联特性initIsa(上)),也了解了结构体的内存对齐(结构体底层探索),也分析了下alloc的底层的源码(alloc底层探索),也知道了实例化一个对象,底层是通过isa和类进行关联的。但一直都没有探索下类,那么接下来,我们就去底层看看类,揭开类神秘面纱。 类的猜想 首先看看下面????这个,我们实例化一个对象,在断点处进行调试 通过打印对象stu的地址,得到ISA,然后和掩码0x00007ffffffffff8作

俊而不逊的博客 811

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

iOS 开发,block是什么?clang -rewrite-objc反编译block,带你揭开block的神秘面纱

iOS 开发,block是什么?clang -rewrite-objc反编译block,带你揭开block的神秘面纱

horisea的博客 2262

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Block介绍(四)解开神秘面纱(下)

终于有空开始这系列最后一篇的编写。 这一篇,我们将看到block的内存管理的内部实现,通过剖析runtime库源码,我们可以更深刻的理解block的内存运作体系。 看此篇时,请大家同时打开两个网址(或者下载它们到本地然后打开): http://llvm.org/svn/llvm-project/compiler-rt/trunk/lib/BlocksRuntime/runti

技术之窗 603

iOS中block介绍(四)揭开神秘面纱(下)

转载地址:http://mobile.51cto.com/hot-403935.htm 终于有空开始这系列最后一篇的编写。这一篇,我们将看到block的内存管理的内部实现,通过剖析runtime库源码,我们可以更深刻的理解block的内存运作体系。内存管理的真面目 objc层面如何区分不同内存区的blockBlock_private.h中有这样一组值:/* the raw data space

924

block介绍(四)揭开神秘面纱(下)

内存管理的真面目   objc层面如何区分不同内存区的block Block_private.h中有这样一组值: /* the raw data space for runtime classes for blocks */ /* class+meta used for stack, malloc, and collectable based blocks */ BLOCK_E

火车追随者的程序人生 869

Objective-C中的meta-class isa

http://zhiwei.li/text/2010/11/objective-c%E4%B8%AD%E7%9A%84meta-class/ 讨论Objective-C的一个奇怪的概念 meta-class 在Objective-C中的每个类,都有它自己相关的me

yohohohoho的专栏 2103

block的理解 ios_iOS中block介绍(四)揭开神秘面纱(下)

看此篇时,请大家同时打开两个网址(或者下载它们到本地然后打开):内存管理的真面目objc层面如何区分不同内存区的blockBlock_private.h中有这样一组值:/*therawdataspaceforruntimeclassesforblocks*//*class+metausedforstack,malloc,andcollectablebasedb...

weixin_39917576的博客 162

DeepSeek V4.1 Flash:MoE稀疏架构如何重构大模型推理范式

MoE(Mixture of Experts)作为大语言模型稀疏化推理的核心架构,其本质并非简单拆分模型,而是通过动态专家路由实现算力的精准调度与高效复用。其技术价值在于显著提升单位硬件成本下的服务稳定性、降低P99延迟波动,并支撑高并发、低SLA偏差的生产级部署。典型应用场景包括代码补全、金融问答、JSON Schema合规生成等对响应确定性要求严苛的任务。V4.1 Flash正是这一思想的工程落地——它以Soft Gating with Expert Anchoring优化路由稳定性,结合Router-

weixin_34117211的博客 335

Objective-C中的meta-class

讨论Objective-C的一个奇怪的概念 meta-class 在Objective-C中的每个类,都有它自己相关的meta-class,但因为你很少直接使用meta-class,所以显得很神秘。 在运行时建立一个类 下面的代码在运行时创建一个NSError新的子类,并添加一个方法到里面:   Class newClass =     objc_allocateCla

把握自己。 2852
上一篇: 深入剖析 OC 中的方法结构 (isa指针的指向,以及元类的概念等)
下一篇: 黑箱中的 retain 和 release
appdeveloperxg
博客等级 码龄11年 38粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值