在UIView的子类中缓存self.bounds

时间:2011-10-18 01:34:57

标签: iphone ios uiview bounds

我正在通过覆盖drawRect来为UIView创建自定义视图的子类。我需要找到一个等于View宽度的10%的点。当然,这个距离计算是微不足道的(self.bounds.size.width / 10.0f)。我想缓存这个值,也就是说,我想将这个值存储在一个实例变量中,以避免在每个drawRect上计算它:。

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

关于缓存视图宽度的最佳位置的任何想法是......如果它甚至可以这样做吗?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

  

这个距离很难计算(self.bounds.size.width / 10.0f)......

     

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

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

你有:

  • 一条objc消息(您将用它来访问缓存的值)
  • 然后您访问结构中的结构字段(几乎是免费的)
  • 然后执行浮点除法(相对于操作 tiny
  

关于缓存视图宽度的最佳位置的任何想法是......如果它甚至可以这样做吗?

最好的地方就在这里:

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

还注意使用乘法的乘法;)