1.众所周知,OC是一门RunTime语言,比如说我们在.h文件中声明一个方法,但不在.m文件实现,编译的时候是可以通过的,运行的时候才会报错,但如果直接声明了一个c语言的函数没有实现,编译就会直接报错。其实xcode在这两种情况下的函数调用是做了不一样的优化的。请看下面代码;
上面的代码只是很简单的写了一个函数test()以及在ViewController里面写了一个相同函数体的test1(),可以看一下在下xcode里面运行后的两种调用方式的反汇编代码。
# Release模式下的情况
* 调用ViewController消息test1()的反汇编代码
可以看到callq *%rbx 就是test1()的调用,从lldb里面进入该函数(命令是s),可以看到test1()里面的过程
* 调用c函数test()的反汇编代码
可以看到,反汇编代码里没有test()的调用,而是直接 movl $0x2, %esi,这时候编译器会认为函数体test()里面的内容过于简单,直接就不调用了,直接优化,将结果2返回。
上面的两种情况的对比:C函数在编译的时候就已经确定了,而OC方法只有在运行时才确定,所以在编译的时候C函数可以被优化,OC方法不行。