首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIView ivar与标记本地UIView变量

UIView ivar与标记本地UIView变量
EN

Stack Overflow用户
提问于 2010-09-27 09:23:57
回答 3查看 475关注 0票数 4

场景1:对于UIViewController,(1)为我在loadView之外的1个或2个函数中再次访问的UIView创建ivar更好吗?或者,(2)我应该只在loadView中标记它,然后使用- (UIView *)viewWithTag:(NSInteger)tag在其他函数中再次访问它吗?我猜选项1增加了指针大小的内存,因此是32/64位,并创建访问器方法(假设我声明了@property & @synthesize),然后需要在dealloc中释放ivar并在viewDidUnload中将其设置为nil……选项2节省了内存,具有较少的设置代码,但需要花费一些处理时间和一些额外的代码来根据标记查找视图。这一切我都说对了吗?

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

场景2:如果UIView的自定义子类有5个子视图,该怎么办?记住,在给定的时间内,我在内存中将有大约30个这个自定义子类的实例(它们将是tableViewCell的子视图),我应该为这些子视图使用5个ivar,还是应该将它们全部标记?

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

有什么想法?

谢谢!

哑光

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-27 09:37:27

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

在写代码的时候,我总是试着去想那些从现在开始一年或两年后会读到代码的人。那个人可能是我,也可能是其他人,但无论哪种方式,我知道那个人会喜欢可读的代码。他们不太可能感谢我在一个至少有128MB内存的设备上节省了1k内存。

票数 5
EN

Stack Overflow用户

发布于 2010-09-27 09:54:27

考虑一下,每个视图都由一个CALayer支持。在IIRC中,视图大约为44字节(加上foo),层大约为44字节(乘以3,因为有表示树和渲染树),执行任何渲染的层都由位图上下文支持。

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

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

  • 在一个笔尖(一堆按钮,每个按钮选择不同的颜色)中有许多类似的视图。我可以连接一堆插座,但然后代码将不得不处理一堆ivar,而不是一些具有类似功能的子视图的页面(例如,滚动视图中的“arithmetic).
  • Lots”,或类似UITableView的容器中的单元格视图)。我可以在数组中跟踪它们,但我觉得自己很懒today.
  • Whenever我需要一个视图来存储额外的整数(例如页码)。还有很多其他的方法(子类化、“关联对象”、在layer.style中粘贴值……)。这通常与前两个位置相关。

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

代码语言:javascript
复制
FooView * f1 = ...;
FooView * f2 = ...;
[f1.contentView addSubview:f2];
NSLog(@"%@ %@", f1.toolbarView, f2.toolbarView);

它打印的是什么?好吧,它们都可以成为f2的工具栏!

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

票数 5
EN

Stack Overflow用户

发布于 2010-09-27 09:36:51

我想你问错问题了。

在我看来,无论是存储5个指针所需的内存,还是使用viewWithTag:查找5个视图所需的时间,在总体方案中都是可以忽略不计的。

选择您找到的任何一种解决方案,使您的代码更易于编写、理解和维护。

如果对时间/内存使用情况的实际分析表明您选择的解决方案是一个问题,这种情况不太可能发生,请考虑其他选项。其他任何事情都是过早的优化。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3800553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档