我想了解生成的程序集和运行时如何协同工作,并在逐步执行一些生成的汇编代码时遇到问题.
来源示例
以下是在XCode 4.5中运行的三行Objective-C:
// Line 1:
NSObject *obj1 = [[NSObject alloc] init];
// Line 2:
[obj1 release];
// Line 3:
NSObject *obj2;
Run Code Online (Sandbox Code Playgroud)
比较生成的程序集
单步执行生成的组件,我做了一些观察.
在第1行之前,地址obj1如下所示:
obj1 (NSObject*) 0x00003604
Run Code Online (Sandbox Code Playgroud)
在第1行之后,它会发生变化:
obj1 NSObject * 0x08122110
Run Code Online (Sandbox Code Playgroud)
意见
1)地址obj1被改变了.编译源代码时,编译器会为其分配临时内存obj1.然后,(在第1行之后)编译器显然重新分配,因此对象的地址发生了变化.
2)第2行之后,地址obj2仍然相同(0x08122110)!当我打电话时[obj1 release],我告诉编译器:"我不再需要它了.请把它带走." 但是系统实际上是在将来某个时候发布,而我似乎无法直接控制它.
3)调试器不能跨越第3行.我不明白为什么它不会!
题
在创建和销毁对象方面,编译器实际使用这些代码行做了什么(特别是"alloc-init",发布和没有赋值的NSObject指针声明)?另外,为什么调试器不会让我跨过第三行呢?调试器可以看不到它吗?
除了答案,如果你能推荐一些关于编译器和运行时系统真正做什么的文档或书籍,我将不胜感激.非常感谢你!
静态变量"声明变量static将其范围限制为仅仅类 - 并且仅限于在文件中实现的类的部分"(Apple doc).
而且我认为在类扩展中定义的变量只有在定义它的类中才有限制范围.
那是类似的!
类扩展中的静态变量和变量有什么不同?