Управление памятью в цикле при создании пользовательского интерфейса - PullRequest
0 голосов
/ 07 февраля 2012

Мы создаем пользовательскую клавиатуру с сущностью следующего кода.

- (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 ]

1 голос
/ 07 февраля 2012

Если вы хотите, чтобы ваши автоматически освобожденные объекты высвобождали ресурсы, вы можете поместить их в пул автоматического выпуска.Например,

- (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];
    }
    }
}

Этот метод был бы особенно полезен, если бы вы создавали множество объектов автоматического выпуска.

1 голос
/ 07 февраля 2012

Этот код не течет. Как вы сказали buttonWithType возвращает автоматически выпущенный объект. Поскольку вы не alloc, copy, new или retain, вы не претендуете на владение чем-либо и вам не нужно (автоматически) выпускать что-либо.

Не было бы никакой разницы, чтобы поместить объявление в цикл. Но это было бы естественное место, чтобы поместить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...