【问题标题】:viewWithTag and addSubviewviewWithTag 和 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];

【问题讨论】:

    标签: ios addsubview


    【解决方案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。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多