【问题标题】:Creating UIButton using helper method使用辅助方法创建 UIButton
【发布时间】:2010-12-31 22:13:18
【问题描述】:

我有一个UITableView 的子类,我想在其中生成许多共享相同属性(字体、textColor、backgroundColor 等)的标签。

我决定实现这一点的最简单方法是创建一个辅助方法,该方法创建具有一些常见属性集的标签:

- (UILabel *)defaultLabelWithFrame:(CGRect)frame {
    UILabel *label = [[UILabel alloc] initWithFrame:frame];
    label.font = [UIFont fontWithName:@"Helvetica" size:14];
    label.textColor = [UIColor colorWithWhite:128.0/255.0 alpha:1.0];
    label.backgroundColor = [UIColor clearColor];

    return label;
}

我使用这样的方法:

UILabel *someLabel = [self defaultLabelWithFrame:CGRectMake(0,0,100,100)];
[self addSubview:someLabel];
[someLabel release];

我在这里担心的是在方法中创建标签时它被保留,但是当我将它分配给someLabel时,它再次被保留,并且在方法中创建时我无法释放内存。

这里最好的方法是什么?

我觉得我有两个选择:

  1. 为默认标签类型创建 UILabel 的子类。
  2. 创建一个名为 defaultLabels 的 NSMutableArray 并将标签存储在此:
- (UILabel *)defaultLabelWithFrame:(CGRect)frame {
    UILabel *label = [[UILabel alloc] initWithFrame:frame];
    label.font = [UIFont fontWithName:@"Helvetica" size:14];
    label.textColor = [UIColor colorWithWhite:128.0/255.0 alpha:1.0];
    label.backgroundColor = [UIColor clearColor];

    [defaultLabels addObject:label];
    [labels release]; //I can release here
    return [defaultLabels lastObject]; //I can release defaultLabels when done
}

我很欣赏你的想法。干杯。

【问题讨论】:

    标签: iphone objective-c ios uikit uibutton


    【解决方案1】:

    您只需要在返回之前自动释放您的对象:

    - (UILabel *)defaultLabelWithFrame:(CGRect)frame
    {
       …
       return [label autorelease];
    }
    

    Cocoa 中的大多数方法都会根据需要保留对象,包括addSubview:。如果没有对象使用(即保留)标签,您不必担心它会被泄露——它已经被添加到自动释放池中,并且会自动释放。

    【讨论】:

    • 所以在使用标签方面,UILabel *label = [self defaultLabelWithFrame:CGRectZero]; ... [标签发布];那我就不用担心释放标签了吗?
    • 对。您不必手动释放标签。保留它的视图将释放它。事实上,你可以简单地使用[self addSubview:[self defaultLabelWithFrame:…]]。
    • 谢谢。我有一种情况,我使用 self.label = [self default...] 然后在 dealloc 中设置 self.label = nil。这样我就可以在需要时保留标签。这不会造成任何问题吗?
    • 否:您的对象将保留它,给它一个 +2 保留计数。然后,自动释放将运行,给它一个 +1 保留计数。然后,当您将其设置为 nil 时,您的对象也会释放它,将其设置为 0(并释放它)。请阅读有关该主题的 Apple 文档,它非常清楚,您不会再遇到内存管理问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多