Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 是否标记UIView或将其保留为属性?_Objective C_Iphone_Cocoa Touch_Uiview_Coding Style - Fatal编程技术网

Objective c 是否标记UIView或将其保留为属性?

Objective c 是否标记UIView或将其保留为属性?,objective-c,iphone,cocoa-touch,uiview,coding-style,Objective C,Iphone,Cocoa Touch,Uiview,Coding Style,这主要是一个风格问题,但自从我开始为iPhone编程以来,我一直很好奇其他人的想法。当您的iPhone应用程序中有UIView,并且需要在应用程序的其他位置(通常在视图控制器的另一个函数中)访问它时,是否希望使用整数标记视图并使用viewWithTag:消息检索它,或者您通常会将其设置为视图控制器中的属性以便于以后访问 将其保存为属性显然会使以后检索更容易,但我认为通过标记视图而不是将其设置为对象属性,可以节省一些内存(可能可以忽略不计) 我通常在视图控制器上创建属性,主要是因为我很懒,用vie

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

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


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

我总是用界面生成器将它们绑定到
IBOutlet
ivars

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


我认为标记对调试有用,但对日常使用没有帮助。

不使用属性不会节省内存-属性只生成一小段代码,引用指向视图的实例变量,如果您指向它或不指向它,它将被保留

使用viewWithTag总是更昂贵、更慢,因为该调用必须遍历视图层次结构,询问每个视图标记值是什么


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

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

我知道这可能与OP的问题无关,但这可能有助于为谷歌提供信息

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

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


再一次,我意识到这并不是询问者所说的那棵树,但这是我发现自己对使用标签感觉很好的唯一用例。

我讨论得晚了,但我认为值得扩展贾斯汀·西尔斯关于使用标签区分视图,特别是控件的观点。有时你需要一个gro由多个按钮组成,这些按钮的作用基本相同,但表示不同的值。计算器上的按钮就是一个很好的例子:所有按钮,或至少所有数字按钮,都将连接到同一个目标和操作。尽管目标可以为每个按钮提供一个出口,并且操作可以将发送者的地址与e进行比较反过来,为每个按钮提供一个标识符,帮助动作识别按下了哪个按钮,就更简单了。这就是标签最有用的地方


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

实际上,属性确实使用了一些内存:4或8字节作为指针。当然,这并不多,而且通常是负的可以理解,但是如果你不使用属性就不节省内存的说法是错误的。如果你使用了大量(十万)对象,那么这几个字节可以加起来。你说的是什么指针?一个属性实际上只是添加了两个新方法(通常),这不会增加内存中每个实例的成本…如果您谈论的是链接到outlet的实例变量,那么不管您如何使用属性,如果您必须从XIB访问项目,您都会得到它。否则,您会忽略它。“…(基于标记的搜索比您自己迭代视图层次结构更快。)tag属性的默认值为0。若要搜索带标记的视图,请使用UIView的viewWithTag:方法。此方法对接收器及其子视图执行深度优先搜索。它不搜索超级视图或视图层次结构的其他部分。因此,从层次结构的根视图调用此方法将搜索hier中的所有视图archy,但从特定子视图调用它只搜索视图的子集。“-Apple Docs(link>char limit)^,尽管我支持使用属性访问视图。基于标记的搜索只比执行自己的深度搜索更快