您是否标记了UIViews或将其保留为属性?

时间:2009-01-29 19:59:45

标签: objective-c iphone cocoa-touch uiview coding-style

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

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

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

6 个答案:

答案 0 :(得分:10)

没有内存可以通过不使用属性来保存 - 一个属性只生成一小部分引用指向您视图的实例变量的代码,如果您指向它,它将被保留。

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

我总是使用IBOutlet实例变量,并且有时在控件中添加标签,除了告诉哪些特定控件称为委托方法可以由几个不同的控件激活之外我不需要做什么。效率稍低,但在这种情况下代码更容易维护。

答案 1 :(得分:6)

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

我认为标签对调试很有用,但不能用于日常使用。

答案 2 :(得分:6)

我认识到这可能与OP的问题相关,但这可能有助于为Google提供帮助。

我发现UIView标记的一个用途实际上是不是通过视图层次结构中的标记找到一个视图(如上所述,它可能变得非常昂贵),而是区分由分配给处理其中几个的委托彼此的两个或多个视图,作为避免大量属性分配的方式(这当然可以使UIViewController代码更紧密耦合)。

一个典型的例子是UITableViewController,其UITableViewDataSource委托已被外部化为一个单独的类。假设UITableViewController后来想要添加一个搜索栏,并希望利用相同的UITableViewDataSource。这意味着将调用UITableViewDataSource方法,并且数据源需要经常区分真正的UITableView和UISearchDisplayController上的searchResultsTableView。如果UITableViewController在每个表视图上设置了一个标记,那么数据源可以根据标记值轻松地分支行为,而不需要引用表视图或(更糟糕的是)搜索显示控制器。

再一次,我意识到这并不是提问者正在吠叫的那棵树,但这是我发现自己在使用标签时感觉良好的唯一用例。

答案 3 :(得分:3)

我总是将它们与Interface builder绑定到IBOutlet ivars

答案 4 :(得分:3)

重申Kendall所说的话,viewWithTag:很贵。我有一个几百次调用循环,循环执行需要2秒多。切换到数组,现在我甚至没有注意到循环运行。

答案 5 :(得分:3)

我迟到了这个讨论,但我认为值得延伸Justin Searls关于使用标签来区分观点,特别是控件的观点。有时您需要一组按钮,这些按钮基本上都是相同的,但代表不同的值。计算器上的按钮就是一个很好的例子:所有按钮,或至少所有数字按钮,都将连接到同一目标和动作。虽然目标可以为每个按钮设置一个插座,并且动作可以依次将发送器的地址与每个插座进行比较,但为每个按钮提供一个标识符可以更加简单,该标识符可以帮助操作识别按下哪个按钮。这是标签最有用的地方。

如果视图控制器需要对视图的引用以进行配置或以其他方式向其发送消息,则使用插座通常是有意义的。如果它只需要一种方法来告诉另一个视图,标签是一个不错的选择。