所以我将一个视图传递给一个方法,我想从视图中包含的CGRect中找到一些值的属性。
- (void)blahblah:(someView*)view
int originX = view.myCGRect.origin.x;
int originY = view.myCGRect.origin.y;
int width = view.myCGRect.size.width;
int height = view.myCGRect.size.height;
这会是一种更好的写作方式吗?
- (void)blahblah:(someView*)view
CGRect sameCGRect = view.myCGRect;
int originX = sameCGRect.origin.x;
int originY = sameCGRect.origin.y;
int width = sameCGRect.size.width;
int height = sameCGRect.size.height;
或者有更有效的方法吗?
另外,我是Objective-C的新手,所以有人可以解释这两种实现之间是否存在差异;如果是的话,它是什么?
答案 0 :(得分:2)
参考旧的,先前接受的答案:
在这种情况下,编译器将无法自动执行子表达式消除。原因是view.myCGRect
实际上是动态调度的消息。
由于编译器事先不知道将调用哪个方法以及它可能产生的副作用,因此可能不会丢弃冗余调用,因为可能存在语义差异。
第二个代码段效率更高。
答案 1 :(得分:0)
见评论: 你正在谈论的是手动"常见的子表达式消除",其中一个共同的值(在这种情况下是view.myCGRect)是"悬挂"在几个参考之前。当公共代码放在循环外部时,这对于循环尤其有效。但是对于大多数(但不是全部)情况,编译器(或JITC for Java)将能够识别这些CSE和#34; hoist"他们自动。但是,如果您进行手动操作,我仍然发现代码通常更容易遵循(和维护)。