English 中文(简体)
你会给你的UIView打标签还是将它们保留为属性?
原标题:
  • 时间:2009-01-29 19:59:45
  •  标签:

这主要是一个风格问题,但自从我开始为iPhone编程以来,我一直很好奇别人的想法。当您在iPhone应用程序中有一个UIView并且需要在应用程序中的其他位置访问它(通常在视图控制器的另一个函数中),您是喜欢使用整数标记视图并使用viewWithTag:消息检索它,还是通常将其设置为视图控制器中的属性以便稍后轻松访问?

将其保存为属性显然使其更容易在以后检索,但我认为通过标记视图而不是将其设置为对象属性可以节省一些(可能是微不足道的)内存。

我一般会在我的视图控制器上创建属性,主要是因为我懒,使用viewWithTag:检索视图很麻烦。

最佳回答

不使用属性并不能节省任何内存 - 属性仅会生成一小部分的代码,该代码指向被保留的实例变量指向你的视图,无论你是否引用它,该实例变量仍然会被保留。

使用viewWithTag会更加昂贵和缓慢,因为该调用必须通过视图层次结构询问每个视图的标记值。

我经常使用IBOutlet实例变量,并有时添加标签到控件上,即使不需要除了告诉哪个特定的控件调用了可能被几个不同控件激活的委托方法以外的任何操作。这样做稍微不太高效,但代码在这种情况下更容易维护。

问题回答

我使用属性。内存影响远远不是需要考虑的问题。viewWithTag:可能也需要一些CPU来使用,但我这样做的主要原因是清晰的代码。访问self.leftSideView比访问[self.view viewWithTag:LEFTSIDEVIEW]更方便,而且你不必管理一个枚举来知道发生了什么。

我认为标签对于调试非常有用,但并不适合日常使用。

我认识到这可能与楼主的问题有些不相关,但这对于帮助谷歌检索可能会有所帮助。

我发现 UIView 标记的一个用途实际上不是通过视图层次结构中的标记来查找视图(如上所述,可能会变得非常昂贵),而是将两个或多个视图通过委托进行区分,该委托负责处理多个视图,以避免大量的属性分配(这肯定会使 UIViewController 代码更加紧密耦合)。

一个典型的情况是UITableViewController的UITableViewDataSource代理被外部化到一个单独的类中。例如,UITableViewController后来想添加一个搜索栏,并希望利用同一个UITableViewDataSource。这意味着UITableViewDataSource方法将被调用,并且数据源需要频繁地区分真实的UITableView和UISearchDisplayController上的searchResultsTableView。如果UITableViewController在每个表视图上设置一个标签,则数据源可以根据标签值很容易地分支行为,而不需要引用表视图或(更糟糕的是)搜索显示控制器。

再次,我意识到这并不完全是提问者所寻找的,但这是我唯一觉得使用标签真正感觉良好的用例。

我总是使用Interface Builder绑定到IBOutlet ivars。

只是重申一下Kendall说的,viewWithTag:很昂贵。我循环调用了几百次,循环需要2秒以上才能执行。我改用了数组,现在我甚至没有注意到循环正在运行。

我来晚了这个讨论,但我认为扩展Justin Searls有关使用标记来区分视图,特别是控件的观点非常值得。有时您需要一组按钮,它们都基本上执行相同的操作但代表不同的值。计算器上的按钮就是一个很好的例子:所有按钮,或至少所有数字按钮,都将连接到同一个目标和操作。虽然目标可以为每个按钮设置输出口,操作可以依次将发送者的地址与每个输出口进行比较,但为每个按钮提供一个标识符以帮助操作区分所按下的按钮会更简单。这就是标记最有用的地方。

如果视图控制器需要参考视图以进行配置或发送消息,通常最好使用输出口。如果它只需要告诉一个视图与另一个有所不同,标签是一个不错的选择。





相关问题
热门标签