首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >存储4个属性的位置(NSPoints)的最有效方法是什么?

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

Stack Overflow用户
提问于 2014-07-07 21:02:33
回答 2查看 64关注 0票数 1

因此,我将一个视图传递到一个方法中,我希望从包含在视图中的CGRect中找到一些值的属性。

代码语言:javascript
复制
- (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;

这会是一种更好的写作方式吗?

代码语言:javascript
复制
- (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还不熟悉,所以有人能解释一下这两种实现之间是否存在差异;如果是,那是什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-15 07:09:53

关于以前被接受的旧答案:

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

由于编译器事先不知道将调用哪种方法以及它可能产生的副作用,所以不能仅仅删除冗余调用,因为可能存在语义上的差异。

第二个代码段将具有更高的性能。

票数 2
EN

Stack Overflow用户

发布于 2014-07-25 13:32:42

请参阅注释:您要做的是手动“公共子表达式消除”,其中一个公共值(在本例中为view.myCGRect)在多个引用之前被“悬挂”。当公共代码放在循环之外时,这对循环尤其有效。但是对于大多数情况(但不是全部),编译器(或JITC for Java)将能够自动识别这些CSE并“提升”它们。但是,我仍然发现,如果您执行手动操作,代码通常更容易遵循(并维护)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24619830

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档