从 NSObject 的初始化了解 isa

格拉姆角场(GAF)实战:用Python实现时间序列图像化处理 本文深入解析了格拉姆角场(GAF)技术,这是一种将一维时间序列转化为二维图像特征的方法,以便利用卷积神经网络(CNN)等图像模型进行深度分析。文章通过Python实战代码,详细演示了GASF和GADF两种核心转换的实现过程,并探讨了其在时序数据分类任务中的应用,为故障预警、金融模式识别等场景提供了强大的图像驱动分析视角。 阅读详情


> 因为 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)


ThinkPad T14 Gen 2与T14P系列对比 表格您的需求推荐机型日常办公、出差、文档处理、视频会议✅(够用、轻便、便宜)视频剪辑、3D建模、编程编译、AI训练、高色准设计✅(性能强、屏幕好、扩展佳)想要未来 5 年不换机✅T14p预算低于 5000 元✅T14 Gen 2(或考虑 T14 Gen 3/4)T14p 2025 款 ≠ 小改款,而是架构级升级它从“高性能笔记本”进化为“AI 移动工作站”,核心差异在于NPU + Ultra 平台 + 全面屏显 + 超长续航。如果您从事AI 开发、视频创作、工程仿真、多任务编程。 阅读详情

相关推荐

halcon3D 点云拟合球体

halon3D 点云拟合球面

weixin_43213429的博客 1639

神秘的 isa 指针

> 因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 `x86_64` 架构下运行的,对于在 arm64 中运行的代码会特别说明。 如果你曾经对 ObjC 底层的实现有一定的了解,你应该会知道 **Objective-C 对象都是 C 语言结构体**,所有的对象都包含一个类型为  `isa` 的

appdeveloperxg的博客 386

keil软件调试(Debug)仿真教程(软件调试和硬件调试的区别)及常用调试按键详解

单片机的调试分为两种,一种是使用软件模拟调试,第二种是硬件调试,两种调试方式各有不同,软件模拟调试有误差,而硬件调试,借用仿真器调试是嵌入式开发中常用方法。

weixin_51624736的博客 3万+

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

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

ANDY_GUO_wei的专栏 2848

别再只调颜色阈值了!优化K210色块追踪性能的5个关键参数与实战技巧

本文深入探讨了K210色块追踪性能优化的五大核心策略,包括图像预处理参数精细调控、find_blobs参数进阶配置、运动控制算法升级、硬件时序优化以及可视化调试系统构建。通过实战技巧和参数调整方法,帮助开发者提升K210在色块追踪项目中的识别稳定性和响应速度,适用于云台追踪等应用场景。

weixin_42531588的博客 225

CARLA 0.9.15从零开始:环境搭建与基础场景实战指南

本文是CARLA 0.9.15从零开始的完整环境搭建与基础运行教程。详细介绍了在Linux系统下配置Python环境、下载安装CARLA核心软件包、启动服务器以及运行第一个基础场景的步骤。重点演示了如何通过Python客户端脚本生成随机车流,并手动控制EGO车辆在仿真城市中行驶,为自动驾驶算法开发构建了坚实的仿真测试基础。

weixin_29053383的博客 776

位域-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

Linux下开机异常(fsck exited with status code 4)

Linux下开机异常事情是这样的,本来我呢跑着程序听着歌,结果忽然就死机了,我只能强制关机,再次打开系统的时候,就提示这样fsck from util-linux 2.26.2 /dev/sda10 contains a file system with errors, check forced. /dev/sda10: Inodes that were part of a corrupted pr

芳草碧连天 2万+

isa指针使用详情

isa指针使用详情

eastWind1101的博客 557

matlab 受约束的 Delaunay 三角剖分【2025最新版】

matlab内置调用函数实现受约束的 Delaunay 三角剖分并将结果保存为STL文件

点云侠的博客 1875

如何学习总线技术

如何学习总线技术 以形象生动的比喻来描绘了总线技术的基本思想,指出了总线的基本分类和总线传输的基本原理,以及在学习过程中应当掌握的最基本的知识,对初学者有起到抛砖引入的作用。 0引言   如果一座只能容一个人来往的独木桥,两端的人都想要过桥,为了不拥挤、阻塞,那我们就得采取有效的办法。比如规定某段时间哪端的人过桥,另一端的人就等着该他过桥的时间段的到来,同时也还可以规定人多时要按先来后到或年

ce123的技术博客 8527

iOS -- isa指针

isa指针

cyberjack的博客 2653

移植Google Gemini Nano到RK3588 NPU,实现高效边缘推理

在嵌入式 AI 开发中,大家常常会遇到模型在硬件平台上运行时出现性能瓶颈的问题,比如推理速度慢、功耗过高,这严重影响了应用的实时性和稳定性 ,导致性能瓶颈,无法满足如智能安防、工业检测等场景的实时性需求。为了解决这些问题,我们可以将轻量模型移植到具有强大算力的硬件平台上。本文将手把手教你将 Google Gemini Nano(或类似轻量模型)移植到 RK3588 NPU,充分发挥 RK3588 NPU 的 6Tops 算力,实现高效的模型推理,提升嵌入式系统的 AI 处理能力。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 293

从 NSObject 初始化了解 isa指针

因为 ObjC 的 runtime 只能在 Mac OS 下才能编译,所以文章中的代码都是在 Mac OS,也就是 x86_64 架构下运行的,对于在 arm64 中运行的代码会特别说明。 如果你曾经对 ObjC 底层的实现有一定的了解,你应该会知道 Objective-C 对象都是 C 语言结构体,所有的对象都包含一个类型为 isa 的指针,那么你可能确实对 ObjC 的底层有所知,不过现...

DCSnail-蜗牛 2343

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

从NSObject开始了解isa

几乎所有的类都是继承自NSObject开始实现的,所有这篇文章我们也将从NSObject类开始来了解对象的创建及isa,文章也将从runtime源码开始让读者了解isa究竟是什么东西。 一:对象分解 NSObject* object = [[NSObject alloc] init]; NSObject* object = (((id)((NSObject *(*)(id, SEL))(v...

jbr5740的专栏 338

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

malloc 初始化_你真的了解 NSObject 对象的初始化吗?

在上一篇文章《利用__attribute__特性提高 APP 的鲁棒性》中,提及了NS_DESIGNATED_INITIALIZER属性。该属性表示指定初始化方法,今天的主题就是聊一聊NSObject的初始化流程。初始化分为两步:1. 分配内存2. 初始化对象的成员变量分配内存如果有C语言开发经验的人,malloc之后,一般需要memset一下。但在Objective-C里面,可不是这样的。苹果这...

weixin_39717704的博客 247

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

runtime源码剖析—— isa 是什么

引言 如果你曾经对 ObjC 底层的实现有一定的了解,你应该会知道 Objective-C 对象都是 C 语言结构体,所有的对象都包含一个类型为 isa 的指针,那么你可能确实对 ObjC 的底层有所知,不过现在的 ObjC 对象的结构已经不是这样了。代替 isa 指针的是结构体 isa_t, 这个结构体中"包含"了当前对象指向的类的信息 上面这段文字是引用“draveness”大神的话,因...

咚个里个呛的博客 601

NSObject

NSObject 文章目录NSObject一、关于 NSObject二、NSObject 属性和方法1、初始化copySelectorClassdescription三、NSObject 协议1、识别与比较对象2、Class 识别类3、消息传递4、代理5、Class, Protocol, Selector6、内存管理方法7、description 属性描述 一、关于 NSObject NSObj...

小田的笔记簿 640

3、iOS底层分析 — isa的初始化&指向分析

isa 通过查看类的源码 objc_class 可以发现里面有一个隐藏的属性 ISA 。 objc_class 中的ISA是隐藏的,是来自于父类 objc_object。 这个ISA 是什么呢? struct objc_class : objc_object { // Class ISA; Class superclass; cache_t cache; ...

shengdaVolleyball的博客 408

iOS NSObject api注解

NSObject对象API注解

IOS_fresh_monkey的博客 747

NSObject的继承图谱、NSObject的详解

NSObject是大多数Objective-C类的继承的根类;它没有父类。通过NSObject,其它类继承了一些基础的与Objective-C语言编译器系统之间的接口,并且获得了在它的实例中表现为一个对象的能力。以下是NSObject类的继承图: 尽管NSObject不是一个严格的抽象类,实际上它已经是一个类。但是通过它自己一个除了表现为一个简单类之外,NSObject实际上几乎无法完成任何有用的操作。为你的程序添加任何属性(attributes)并制定实现逻辑,你必须创建一个或者多个从NSObject..

u013712343的博客 741

NSObject 底层原理分析(一)

NSObject 底层原理分析初始化调用alloc方式调用init方式调用new方式销毁调用dealloc NSObject在Objective-C中大多数类层次结构的根类,通常我们在使用NSObject对象时,会使用[[NSObject alloc] init] 或者 [NSObject new]创建对象实例,通过这篇文章,我们一起研究关于NSObject的对象创建过程。 初始化 调用alloc方式 当我们调用[NSObject alloc]方法时候,会调用_objc_rootAlloc(self)这个方

weixin_39647415的博客 575

ios开发 之 NSObject详解

NSObject是大部分Objective-C类继承体系的根类。这个类遵循NSObject协议, 提供了一些通用的方法,对象通过继承NSObject,可以从其中继承访问运行时的接口,并让对象具备Objective-C对象的基本能力。下面我们就详细的介绍NSObject。

曾治铭的博客 1万+

一个NSObject对象占多大内存

文章目录先说结论探究原理结论 先说结论 一个NSObject对象占16个字节。 探究原理 之前runtime系列的文章中写过,编译期会将objc_class结构体中的class_ro_t结构体初始化,那篇文章没有讲是如何初始化的,学完了分类后,在转为c++的代码里我看到了一些眉目。 首先这是main.m文件 #import <Foundation/Foundation.h> #import "Father.h" @interface Student : NSObject { int _

wtl1804的博客 697
上一篇: 黑箱中的 retain 和 release
下一篇: iOS中 setNeedsDisplay和setNeedsLayout方法的不同
appdeveloperxg
博客等级 码龄11年 38粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值