gpt4 book ai didi

objective-c - 编译器和运行时系统在我生成的程序集中真正做了什么?

转载 作者:太空狗 更新时间:2023-10-30 03:34:35 25 4
gpt4 key购买 nike

我想了解生成的程序集和运行时如何协同工作,并且在单步执行一些生成的汇编代码时遇到了一个问题。

来源示例

这是在 XCode 4.5 中运行的三行 Objective-C:

// Line 1:
NSObject *obj1 = [[NSObject alloc] init];

// Line 2:
[obj1 release];

// Line 3:
NSObject *obj2;

比较生成的程序集

逐步浏览生成的程序集,我做了一些观察。

在第1行之前,obj1的地址如下所示:

obj1    (NSObject*) 0x00003604

在第 1 行之后,它发生了变化:

obj1    NSObject *  0x08122110

观察

1) obj1 的地址已更改。编译源代码时,编译器会为obj1分配临时内存。然后,(在第 1 行之后)编译器显然重新分配,因此对象的地址发生变化。

2)第2行之后,obj2的地址还是一样(0x08122110)!当我调用 [obj1 release] 时,我告诉编译器:“我不再需要它了。请把它拿走。”但是系统实际上在将来的某个时间点进行发布,我似乎无法直接控制它。

3)调试器不能越过第3行,我不明白为什么不能!

问题

在创建和销毁对象方面,编译器实际上用这些代码行做什么(特别是“alloc-init”、释放和没有赋值的 NSObject 指针声明)?另外,为什么调试器不让我越过第三行?调试器能看不出来吗?

除了答案,如果您能推荐一些关于编译器和运行时系统真正作用的文档或书籍,我将不胜感激。非常感谢!

最佳答案

  1. 在堆栈上创建名为 obj1 的指针。它未初始化,这意味着它将包含该内存位置中的任何内容。这是错误的源头,因为使用未初始化的指针会导致未指定的行为。一旦分配了对象,指针就会用它的地址初始化。

  2. 地址没有改变,因为指针没有更新。当 -release 消息被发送到对象时,保留计数器通常会减一。如果保留计数器已经为 1,则调用 -dealloc 方法并将内存标记为空闲。只有指针指向的内存被标记为空闲,但指针保持不变。这就是为什么有些人更愿意在不再需要它们时将它们的指针也设置为 nil

  3. 您正在创建一个未初始化的指针。由于它没有被初始化,它将重用已经在存储指针的内存位置的数据。

关于书籍推荐。我会推荐编译器:原理、技术和工具

关于objective-c - 编译器和运行时系统在我生成的程序集中真正做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15900029/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com