末了点击下一步,选择一个保存你工程的地址。
1 + 1 你要做的第一件事就是写一个两个数相加后并返回的函数。没有比这更简单的事了。
事实上,你可以先写一个C语言函数,因为Objective-C会是我们的复杂度增长。在Supporting Files里打开main.m,并把下面的代码贴到文件内:
int addFunction(int a, int b) {
int c = a + b;
return c;
}
现在保证你选择的Scheme是iOS装备(或者你的装备名),比如,如果你连上了装备就是xx的iPhone。选择Scheme是装备的缘故起因是如许才会用ARM汇编,而选择模拟器的话就会用x86的方式汇编。Scheme选择后的类似于如许:
指令bl意味着函数调用。记得函数的入参已经放入相关的寄存器r0及r1了吧。这个指令实行的代码我们称之为分支。因为是指令bl而不是指令b,指令bl全称是『branch with link』,意味着在实行分支代码之前,需要将lr(链接寄存器)置为当前函数的下一个指令。追念下,当addFunction方法返回时,lr就是指向下一个要实行的指令。
int c = a + b;
return c;
}
让我们再次重复之前精简的汇编方式,搜刮addValue:toValue:函数,可以看到:
“-[ViewController addValue:toValue:]”:
adds r0, r3, r2
bx lr
首先你会注意到标署名字。这次便署名字包罗了类名及全部的方法名。
如果你和之前的addFunction汇编代码相比较,你会发现两个入参存储在了r2及r3而不是r0和r1。为什么呢?
OK,因为Objective-C函数在C函数的基础上多传了两个隐式的参数。addValue:toValue:方法语法上和以下方法雷同:
int ViewController_addValue_toValue(id self, SEL _cmd, int a, int b) {
int c = a + b;
return c;
}
这就是为什么a和b变量分别存储在r2和r3内了。现在你大概知道了前两个隐式参数的含义了,你总是可以使用self这个变量。
但是,_cmd大概之前你没有见过。像self变量一样,在Objective-C代码中它是可获取的,而且代表着当前函数的selector。你一样平常从不会用到它,这就是你为何没听过的缘故起因了。
为了看清Objective-C函数是如何被调用的,我们在ViewController中添加如下代码: