代码之家  ›  专栏  ›  技术社区  ›  ma11hew28

UIView ivar与标记本地UIView var

  •  4
  • ma11hew28  · 技术社区  · 14 年前

    场景1: 对于UIViewController,最好是(1)为UIView创建一个ivar,我可以在其外部的1个或2个函数中再次访问它 loadView ? 或者,(2)我应该把它贴上标签吗 然后使用 - (UIView *)viewWithTag:(NSInteger)tag @property & @synthesize ),然后需要在中释放ivar dealloc 设置为 nil viewDidUnload ... 选项2节省了内存,设置代码更少,但是需要花费一些处理时间和一些额外的代码来通过标签找到视图。我说的对吗?

    在这种情况下,使用ivar感觉最好,但我不确定。

    场景2: tableViewCell s、 ),我应该为子视图使用5个ivar,还是应该标记所有ivar?

    在这个场景中,我认为标记它们所节省的内存值得使用 -(UIView*)viewWithTag:(NSInteger)标记 .

    谢谢!

    3 回复  |  直到 14 年前
        1
  •  5
  •   Jacques    13 年前

    考虑到内存使用方面的差异可以忽略不计(除非您将拥有100个这样的视图,在这种情况下,您可能需要研究如何重用其中的一些视图),您可能应该考虑如何使代码更具可读性和可维护性。我个人认为使用ivar会更具可读性,但对于您的特定情况,使用标记也可能更具可读性。

    当我写代码的时候,我总是试着想想一年或两年后要读代码的人。那个人可能是我,也可能是其他人,但不管怎样,我知道那个人会喜欢可读的代码。他们不太可能感谢我在一个至少有128MB内存的设备上节省了1k内存。

        2
  •  5
  •   tc.    14 年前

    或者,更直接的比较是:每个指针消耗的内存与 单个像素 .

    我只在让我的生活更轻松的地方使用标签:

    • 如果笔尖中有相似的视图(一堆按钮,每个按钮选择不同的颜色),则会有很多。我可以连接一堆outlet,但是代码必须处理一堆ivar,而不是一点算术)。
    • 许多具有类似功能的子视图(例如滚动视图中的“页面”,或类似UITableView的容器中的单元格视图)。我可以把他们排成一排,但我今天感觉很懒。
    • 每当我需要一个视图来存储一个额外的整数(例如页码)。还有很多其他的方法(子类化,“关联对象”,将值粘贴到 layer.style ...). 这通常与前两个地方有关。

    [v viewWithTag:tag] v ,任何子视图,子视图的任何子视图。。。考虑一个类视图,它有一个带有标记1的“内容视图”和一个带有标记2的“工具栏视图”:

    FooView * f1 = ...;
    FooView * f2 = ...;
    [f1.contentView addSubview:f2];
    NSLog(@"%@ %@", f1.toolbarView, f2.toolbarView);
    

    f2 的工具栏!

    是的,苹果可以使搜索更合理(它可以继续搜索,直到找到最不深的匹配,或者使用迭代深化深度优先搜索),但我假设它执行简单的深度优先搜索,除非文档另有说明。

        3
  •  4
  •   David Gelhar    14 年前

    我想你问错问题了。

    在我看来,要么是存储5个指针所需的内存,要么是使用 viewWithTag: 在这个宏大的计划中是微不足道的。

    选择使代码更易于编写、理解和维护的解决方案。