15

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

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

我通常在我的视图控制器上创建属性,主要是因为我很懒,并且用它来检索视图viewWithTag:很烦人。

4

6 回答 6

10

不使用属性不会节省内存 - 属性只会生成一小段代码,这些代码引用指向您的视图的实例变量,无论您是否指向它,它都会被保留。

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

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

于 2009-01-30T04:02:58.000 回答
6

我使用属性。内存影响远不是一个需要考虑的问题。viewWithTag: 也可能会消耗一点 CPU 来使用,但我这样做的主要原因是产生的代码更干净。访问 self.leftSideView 比访问 [self.view viewWithTag:LEFTSIDEVIEW] 要好得多,而且您不必管理枚举即可知道发生了什么。

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

于 2009-01-30T04:02:08.457 回答
6

我认识到这可能与 OP 的问题无关,但这可能有助于为谷歌提供信息。

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

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

再一次,我意识到这并不完全是提问者吠叫的树,但这是我发现自己对使用标签感觉很好的唯一用例。

于 2010-02-28T02:45:04.913 回答
3

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

于 2009-01-29T20:04:46.657 回答
3

只是重申肯德尔所说的,viewWithTag:很昂贵。我有一个几百次调用的循环,循环需要 2 秒以上的时间才能执行。切换到一个数组,现在我什至没有注意到循环正在运行。

于 2009-06-04T16:24:24.920 回答
3

我迟到了这个讨论,但我认为值得扩展 Justin Searls 关于使用标签来区分视图,特别是控件的观点。有时您需要一组按钮,它们基本上都做相同的事情,但代表不同的值。计算器上的按钮就是一个很好的例子:所有按钮,或至少所有数字按钮,都将连接到相同的目标和动作。尽管目标可以为每个按钮提供一个出口,并且动作可以依次将发送者的地址与每个出口进行比较,但给每个按钮一个标识符以帮助动作识别哪个按钮被按下要简单得多。这是标签最有用的地方。

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

于 2011-03-19T07:20:01.277 回答