存储4个属性(NSPoints)的位置的最有效方法是什么?

时间:2014-07-07 21:02:33

标签: objective-c cocoa reference

所以我将一个视图传递给一个方法,我想从视图中包含的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的新手,所以有人可以解释这两种实现之间是否存在差异;如果是的话,它是什么?

2 个答案:

答案 0 :(得分:2)

参考旧的,先前接受的答案:

在这种情况下,编译器将无法自动执行子表达式消除。原因是view.myCGRect实际上是动态调度的消息。

由于编译器事先不知道将调用哪个方法以及它可能产生的副作用,因此可能不会丢弃冗余调用,因为可能存在语义差异。

第二个代码段效率更高。

答案 1 :(得分:0)

见评论: 你正在谈论的是手动"常见的子表达式消除",其中一个共同的值(在这种情况下是view.myCGRect)是"悬挂"在几个参考之前。当公共代码放在循环外部时,这对于循环尤其有效。但是对于大多数(但不是全部)情况,编译器(或JITC for Java)将能够识别这些CSE和#34; hoist"他们自动。但是,如果您进行手动操作,我仍然发现代码通常更容易遵循(和维护)。