场景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搜索它们的小性能冲击。
有什么想法?
谢谢!
哑光
发布于 2010-09-27 09:37:27
考虑到内存使用的差异可以忽略不计(除非您将有100个这样的视图,在这种情况下,您可能希望研究如何重用其中的一些视图),您可能应该考虑如何使代码更具可读性和可维护性。我个人认为使用ivar会更具可读性,但也有可能针对您的特定情况使用标记会更具可读性。
在写代码的时候,我总是试着去想那些从现在开始一年或两年后会读到代码的人。那个人可能是我,也可能是其他人,但无论哪种方式,我知道那个人会喜欢可读的代码。他们不太可能感谢我在一个至少有128MB内存的设备上节省了1k内存。
发布于 2010-09-27 09:54:27
考虑一下,每个视图都由一个CALayer支持。在IIRC中,视图大约为44字节(加上foo),层大约为44字节(乘以3,因为有表示树和渲染树),执行任何渲染的层都由位图上下文支持。
或者,为了进行更直接的比较:每个指针消耗与单个像素一样多的内存。
我只在让我的生活更轻松的地方使用标签:
layer.style中粘贴值……)。这通常与前两个位置相关。另外,请记住,[v viewWithTag:tag]可以返回v、任何子视图、子视图的任何子视图...考虑一个类FooView,它有一个带有标记1的“内容视图”和一个带有标记2的“工具栏视图”:
FooView * f1 = ...;
FooView * f2 = ...;
[f1.contentView addSubview:f2];
NSLog(@"%@ %@", f1.toolbarView, f2.toolbarView);它打印的是什么?好吧,它们都可以成为f2的工具栏!
是的,苹果可以让搜索更有意义(它可以继续搜索,直到找到深度最小的匹配,或者使用迭代加深深度优先搜索),但我假设它执行的是简单的深度优先搜索,除非文档另有说明。
发布于 2010-09-27 09:36:51
我想你问错问题了。
在我看来,无论是存储5个指针所需的内存,还是使用viewWithTag:查找5个视图所需的时间,在总体方案中都是可以忽略不计的。
选择您找到的任何一种解决方案,使您的代码更易于编写、理解和维护。
如果对时间/内存使用情况的实际分析表明您选择的解决方案是一个问题,这种情况不太可能发生,请考虑其他选项。其他任何事情都是过早的优化。
https://stackoverflow.com/questions/3800553
复制相似问题