Van*_*nny 3 arrays oop design-patterns objective-c
我正在努力解决代码"执行顺序"的概念,到目前为止,我的研究已经很短暂.我不确定我是否错误地表达了它,这个概念可能有更合适的术语.如果有人能对我下面的各种绊脚石有所了解,我会很感激.
我明白,如果你一个接一个地调用一个方法:
[self generateGrid1];
[self generateGrid2];
Run Code Online (Sandbox Code Playgroud)
两种方法都在运行,但generateGrid1不一定等待generateGrid2.但是,如果我需要它呢?假设generateGrid1执行一些复杂的计算(需要花费未知的时间)并填充generateGrid2用于计算的数组?这需要在每次触发事件时完成,这不仅仅是一次初始化.
我需要一种方法来顺序调用方法,但有一些方法等待其他方法.我已经调查了回调,但在我见过的所有例子中,这个概念总是与代表结婚.
我也不确定何时确定我无法合理地期望及时解析一行代码以便使用它.例如:
int myVar = [self complexFloatCalculation];
if (myVar <= 10.0f) {} else {}
Run Code Online (Sandbox Code Playgroud)
我如何确定某些事情是否需要花费足够长的时间才能实现"在开始我的事情之前是否完成了其他事情"的检查.只是反复试验?
或者我可能正在将方法作为另一种方法的参数传递?是否等待在执行方法之前评估参数?
[self getNameForValue:[self getIntValue]];
Run Code Online (Sandbox Code Playgroud)
我明白,如果你一个接一个地调用一个方法:
Run Code Online (Sandbox Code Playgroud)[self generateGrid1]; [self generateGrid2];两种方法都在运行,但generateGrid1不一定等待generateGrid2.但是,如果我需要它呢?
假.generateGrid1将运行,然后generateGrid2将运行.这种顺序执行是过程语言的基础.
从技术上讲,编译器被允许重新声明,但只有当最终结果将是可证明从原来的没有区别.例如,查看以下代码:
int x = 3;
int y = 4;
x = x + 6;
y = y - 1;
int z = x + y;
printf("z is %d", z);
Run Code Online (Sandbox Code Playgroud)
无论是先行x+6还是y-1先发生线都无关紧要; 写入的代码不使用除计算之外的任何中间值z,并且可以以任何顺序发生.因此,如果编译器可以出于某种原因通过重新排列这些行来生成更高效的代码,则允许这样做.
但是,您永远无法看到这种重新排列的效果,因为只要您尝试使用其中一个中间值(例如,记录它),编译器就会识别出该值正在被使用,并获得摆脱会破坏你的日志记录的优化.
实际上,编译器不需要按照提供的顺序执行代码; 它只需要生成与您提供的代码功能相同的代码.这意味着如果将调试器附加到使用优化编译的程序,您实际上可以看到这些优化的效果.这导致了各种令人困惑的事情,因为调试器跟踪的源代码不一定与编译器生成的编译代码的代码逐行匹配.这就是为什么程序的调试版本几乎总是关闭优化的原因.
无论如何,重点是编译器只有在能够证明没有效果时才能做这些技巧.Objective-c方法调用是动态绑定的,这意味着编译器完全无法保证在调用该方法时在运行时实际发生的事情.由于编译器无法保证将会发生什么,因此编译器永远不会重新排序Objective-C方法调用.但同样,这又回到了我之前所说的相同原则:编译器可能会改变执行顺序,但只有在用户完全察觉不到的情况下.
换句话说,不要担心.您的代码将始终从上到下运行,每个语句都在等待它完成之前的语句.
通常,您在所描述的样式中看到的大多数方法调用都是同步的,这意味着它们将具有您想要的效果,按语句编码的顺序运行,其中第二个调用仅在第一个调用完成后运行,回报.
此外,当方法接受参数时,在调用方法之前评估其参数.
| 归档时间: |
|
| 查看次数: |
717 次 |
| 最近记录: |