MST

星途 面试题库

面试题:Objective-C中类方法与实例方法在内存分配上有何不同

请详细阐述Objective-C里类方法和实例方法在内存分配机制上的差异,比如它们所对应的代码在内存中的存储位置以及调用时内存相关的操作等。
29.3万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

类方法和实例方法在内存分配机制上的差异

  1. 代码存储位置
    • 类方法:类方法属于类对象。在Objective - C中,类对象是元类(meta - class)的实例。类方法的代码存储在元类的方法列表中。元类存储在程序的代码段(text segment),这部分内存是只读的,所有类对象共享这部分代码,因为类方法并不依赖于特定的实例,所以对于一个类来说,其类方法的代码只有一份。
    • 实例方法:实例方法属于类的实例对象。实例方法的代码存储在类对象的方法列表中。同样,类对象也存储在程序的代码段(text segment),并且对于一个类来说,其所有实例对象共享这些实例方法的代码。
  2. 调用时内存相关操作
    • 类方法调用:当调用类方法时,由于类方法属于元类,通过类对象(元类的实例)直接找到元类的方法列表,然后根据方法选择器(selector)在方法列表中找到对应的实现。在调用过程中,不需要为具体的实例对象分配额外的内存来存储实例变量等信息,因为类方法不依赖于实例状态。调用类方法时,系统主要在栈(stack)上为方法调用分配栈帧,用于存储方法的局部变量、参数和返回地址等。
    • 实例方法调用:调用实例方法时,首先要通过实例对象的isa指针找到对应的类对象,然后在类对象的方法列表中根据方法选择器(selector)找到实例方法的实现。由于实例方法可能会访问实例变量,所以在调用实例方法前,需要为实例对象分配内存来存储实例变量。实例对象的内存通常在堆(heap)上分配。在调用实例方法时,同样在栈(stack)上为方法调用分配栈帧,栈帧中除了存储局部变量、参数和返回地址外,还会包含指向实例对象的指针(self),以便方法可以访问实例对象的实例变量。

综上所述,类方法和实例方法在代码存储位置上都在代码段,但分别与元类和类对象的方法列表关联;在调用时,实例方法需要考虑实例对象在堆上的内存分配以及栈上针对实例访问的相关操作,而类方法调用相对简单,主要是在栈上为方法调用分配栈帧,不涉及实例对象的堆内存分配。