UIView ivar与标记本地UIView var

ma1*_*w28 4 tags iphone objective-c instance-variables uiview

场景1:对于UIViewController,最好是(1)为UIView创建一个ivar,我在1或2个函数之外再次访问loadView?或者,(2)我应该只将其标记loadView,然后- (UIView *)viewWithTag:(NSInteger)tag再用于在其他功能中再次访问它?我猜测,选项1个增加通过指针的大小的存储器,所以64分之32位,并创建存取方法(假设我声明@property&@synthesize),然后需要释放所述的ivar dealloc并将其设置为nilviewDidUnload...并且该选项2节省了内存,设置代码较少,但是花费了一些处理时间和一些额外的代码来通过其标记查找视图.我对这一切是对的吗?

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

场景2:UIView的自定义子类有5个子视图怎么样?请记住,在给定时间内,我将在内存中有大约30个此自定义子类的实例(它们将是tableViewCells的子视图),我应该使用5个ivars作为子视图,还是应该将它们全部标记?

在这种情况下,我认为通过标记它们所节省的内存将值得用它来搜索它们的小性能- (UIView *)viewWithTag:(NSInteger)tag.

思考?

谢谢!

马特

Jac*_*ues 5

考虑到内存使用量的差异可以忽略不计(除非你有100个这样的视图,在这种情况下你可能想要研究如何重用这些视图),你应该考虑什么会使你的代码更多可读和可维护.我个人认为使用ivar会更具可读性,但对于您的特定情况,使用标签也可能更具可读性.

在编写代码时,我总是会考虑从现在开始一年或两年后阅读代码的人.那个人可能是我,或者可能是其他人,但不管怎样,我知道那个人会喜欢可读的代码.他们不太可能感谢我在具有至少128 MB RAM的设备上节省1k内存.


tc.*_*tc. 5

暂时考虑每个视图都由CALayer支持.IIRC,视图大约是44个字节(加上foo),层大约是44个字节(第3个,因为有一个表示树和渲染树),并且进行任何渲染的层都由位图上下文支持.

或者,为了更直接的比较:每个指针消耗的内存与单个像素一样多.

我只使用标签让他们的生活更轻松:

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

另外,请记住,[v viewWithTag:tag]可以返回v任何子视图,任何子视图子视图......考虑一个类FooView,它具有带标记1的"内容视图"和带有标记2的"工具栏视图":

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

什么印刷?嗯,他们俩都可能是f2工具栏!

是的,Apple可以使搜索更加明智(它可以继续搜索,直到找到最深的匹配,或使用迭代加深深度优先搜索),但我认为它执行简单的深度优先搜索,除非文档否则说.