构建UI时循环中的内存管理

时间:2012-02-06 23:37:22

标签: objective-c ios cocoa-touch memory-management

我们正在构建一个具有以下代码精华的自定义键盘。

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIButton *numericButton;

    for (int i = 1; i < 13; i++) {

        numericButton = [UIButton buttonWithType:UIButtonTypeCustom];

        int xorig, yorig;
        int w = BUTTON_SIZE_W_EDG;
        int tag = i;

        numericButton.frame = CGRectMake(xorig, yorig + BUTTON_OFFSET, w, BUTTON_SIZE_H);
        numericButton.tag = tag;

        [numericButton addTarget:self 
                          action:@selector(buttonPressed:) 
                forControlEvents:UIControlEventTouchUpInside];

        [self.view addSubview:numericButton];
    }
}

我的问题是,将numericButton重新分配给新的UIButton是否会导致内存泄漏? buttonWithType返回一个自动释放的UIButton,但我不确定以前的numericButton是否会被这个代码释放。将声明置于for循环中会有什么不同吗?

感谢

2 个答案:

答案 0 :(得分:1)

此代码不会泄漏。如你所说buttonWithType返回一个自动释放的对象。由于您没有alloccopynewretain,因此您不会声明对任何内容的所有权而且您不需要(自动)释放任何东西。

将声明放在循环中没有任何区别。但这是自然而然的地方。

答案 1 :(得分:1)

如果要确保自动释放的对象释放资源,可以将它们放入自动释放池中。 例如

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIButton *numericButton;

    for (int i = 1; i < 13; i++) {
    @autoreleasepool {
        numericButton = [UIButton buttonWithType:UIButtonTypeCustom];

        int xorig, yorig;
        int w = BUTTON_SIZE_W_EDG;
        int tag = i;

        numericButton.frame = CGRectMake(xorig, yorig + BUTTON_OFFSET, w, BUTTON_SIZE_H);
        numericButton.tag = tag;

        [numericButton addTarget:self 
                          action:@selector(buttonPressed:) 
                forControlEvents:UIControlEventTouchUpInside];

        [self.view addSubview:numericButton];
    }
    }
}

如果要实例化大量自动释放对象,此方法将特别有用。