viewWithTag 和 addSubview
Posted
技术标签:
【中文标题】viewWithTag 和 addSubview【英文标题】:viewWithTag and addSubview 【发布时间】:2012-03-13 20:46:54 【问题描述】:我试图通过在按下 UIButton 时调用 viewWithTag 来重用标签。代码第一次执行时看起来没问题,但是由于第 7 行,它是否在多次执行时泄漏?另外,从 superview、alloc 和 addSubview 中删除标签而不是使用 viewWithTag 是否更好?
1. UILabel *label = (UILabel *)[self.view viewWithTag:100];
2. if(label == nil)
3. label = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 20, 20)] autorelease];
4. label.tag = 100;
5.
6.
7. [self.view addSubview:label];
【问题讨论】:
【参考方案1】:将代码 [self.view addSubview:label];
移动到您的 if
块中。当您的 if 条件为 false 时,这意味着标签已经是您的视图控制器视图层次结构的一部分,因此如果您像在原始代码中一样再次添加它,它将被双重保留。
UILabel *label = (UILabel *)[self.view viewWithTag:100];
if (!label)
label = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 20, 20)] autorelease];
label.tag = 100;
[self.view addSubview:label];
【讨论】:
我要试一试。我怎样才能捕捉到这样的内存泄漏? 使用仪器发现潜在的泄漏。这是一个教程:raywenderlich.com/2696/… 由于某种原因,instruments 认为我之前的代码没有任何泄漏。【参考方案2】:如果您使用的是 .xib 或故事板,只需将其与 IBOutlet 链接。
如果您只使用代码,请尝试将其保存为私有变量。
【讨论】:
我以编程方式创建视图,因此我需要管理很多 ivars。以上是关于viewWithTag 和 addSubview的主要内容,如果未能解决你的问题,请参考以下文章
Swift,集合视图和情节提要,在另一个标签上使用 viewWithTag 时为空
为啥将“viewWithTag”与“dequeueReusableCellWithIdentifier”一起使用?
uiview 容器 - viewwithtag 有时返回 null