1

我正在继承 UIView 以通过覆盖 drawRect: 来制作自定义视图。我需要找到一个等于视图宽度 10% 的点。当然,这个距离计算起来很简单(self.bounds.size.width/10.0f)。我想缓存这个值,也就是说,我想把这个值存储在一个实例变量中,以避免必须在每个 drawRect: 上计算它。

我将在什么方法中存储这个值?我正在考虑只在 initWithFrame: 中保存变量的值,但是在任何类型的调整大小之后,缓存的值都会与视图的宽度不同步。

关于缓存视图宽度的最佳位置是什么的任何想法......以及是否可以这样做?

4

2 回答 2

3

这个距离计算起来很简单(self.bounds.size.width/10.0f)......

我想缓存这个值,也就是说,我想把这个值存储在一个实例变量中,以避免必须在每个 drawRect: 上计算它。

这里的一切都是微不足道的。没有理由缓存它。

你有:

  • 一条 objc 消息(用于访问缓存值)
  • 然后您访问结构中的结构的字段(实际上是免费的)
  • 然后你执行一个浮点除法(相对于操作仍然很小)

关于缓存视图宽度的最佳位置是什么的任何想法......以及是否可以这样做?

最好的地方就在这里:

- (void)drawRect:(CGRect)rect {
  // ...
  const CGFloat tenthWidth = self.bounds.size.width * 0.10f;
  // ...
}

还要注意倒数乘法的使用;)

于 2011-10-18T05:19:30.397 回答
3

您可以将值存储在 ivar 中并(重新)在 layoutSubviews 中计算它。

然而,这是一个明显的过早优化案例。您应该专注于编写好的代码,并在需要时进行优化。事实上,这种“优化”甚至可能对您的应用程序的性能产生负面影响:将两个数字相除还是查找 ivar 的值更昂贵?

于 2011-10-18T02:09:32.593 回答