因此,我将一个视图传递到一个方法中,我希望从包含在视图中的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;还是有一种更有效的方法来做到这一点?
另外,我对目标C还不熟悉,所以有人能解释一下这两种实现之间是否存在差异;如果是,那是什么呢?
发布于 2015-03-15 07:09:53
关于以前被接受的旧答案:
在这种情况下,编译器将无法自动执行子表达式消除。原因是view.myCGRect实际上是一个动态发送的消息。
由于编译器事先不知道将调用哪种方法以及它可能产生的副作用,所以不能仅仅删除冗余调用,因为可能存在语义上的差异。
第二个代码段将具有更高的性能。
发布于 2014-07-25 13:32:42
请参阅注释:您要做的是手动“公共子表达式消除”,其中一个公共值(在本例中为view.myCGRect)在多个引用之前被“悬挂”。当公共代码放在循环之外时,这对循环尤其有效。但是对于大多数情况(但不是全部),编译器(或JITC for Java)将能够自动识别这些CSE并“提升”它们。但是,我仍然发现,如果您执行手动操作,代码通常更容易遵循(并维护)。
https://stackoverflow.com/questions/24619830
复制相似问题