【问题标题】:where static / class methods are stored in objective c其中静态/类方法存储在目标 c
【发布时间】:2014-01-08 03:50:42
【问题描述】:

假设我们在MyClass.h文件中声明一个类如下。

#import <Foundation/Foundation.h>

@interface MyClass : NSObject


+(void)aClassMethod;

@end

MyClass.m 文件中..

@implementation MyClass

+(void)aClassMethod{

NSLog(@"It is a Class method");

}
@end

我的问题是编译后这个aClassMethod 将被存储在哪里? 如果我们声明一些成员函数,那么它们将被存储在哪里。

【问题讨论】:

  • 也许这可以回答您的问题:stackoverflow.com/questions/982116/… 或者如果您需要更多深度:friday.com/bbum/2009/12/18/objc_msgsend-part-1-the-road-map
  • 其实我想知道类方法存放在栈、代码还是数据段的什么位置??编译器完成了哪些任务来处理类方法?
  • 你应该改变你的问题。
  • 您所说的成员函数在Objective-C中称为实例方法
  • @MohanChaudhari 扩展一下 jlehr 的答案,如果你 clang -rewrite-objc main.c 你的程序,你会看到类方法转向静态 C 函数,因此它们在生成的对象中被标记为这样。有关内存布局的等效 C 问题的详细信息适用于 Objective-C,因为不同之处在于 Objective-C 程序与执行消息分派的运行时链接,如上面 vikingosegundo 所示。

标签: objective-c oop static-methods class-method


【解决方案1】:

Objective-C 方法被编译成 C 函数,这些函数与程序定义的任何其他 C 函数一起存储在程序的 Text 段中。对于类方法和实例方法都是如此。

【讨论】:

    【解决方案2】:

    其实我想知道类方法存放在栈、代码还是数据段的什么地方??以及编译器完成了哪些任务 处理类方法?

    这个问题并不完全有道理。

    可执行代码存放在所有可执行代码存放的地方;在 mach-o TEXT 段中。代码被映射到只读、可执行、内存页的内存中。内存不能被读写(即你不能编辑内存中的可执行文件)。

    Objective-C 方法是标准的 C 函数,总是接受两个参数; self_cmd

    调用约定而言,代码的调用方式与任何其他 C 函数一样。唯一的区别是将调用站点 ([NSObject new]) 与要调用的可执行代码相匹配的方法分派机制。该匹配是通过 Objective-C 信使完成的,并由 objc_msgSend() 或一些变体实现。

    【讨论】:

      猜你喜欢
      • 2013-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 2020-08-06
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多