2012-06-24 3 views
0

Во время loadView Я создаю 20 UIButton с тем, что я хотел бы изменить текст заголовка в зависимости от состояния UIPageControl.Создание UIButtons

У меня есть pre-save plist, который загружается в NSArray под названием arrChars при изменении текущей страницы. Я устанавливаю названия кнопок в их соответствующее текстовое название из массива. Код, который делает это:

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

    UIButton *uButton = (UIButton *)[self.view viewWithTag:i]; 

    if(iPage == 1) { 
     iArrPos = (i - 1); 
    } else { 
     iArrPos = (iPage * ButtonsPerPage) + (i - 1); 
    } 

    [uButton setAlpha:0]; 

    NSLog(@"Trying: %d of %d", iArrPos, [self.arrChars count]); 
    if (iArrPos >= [self.arrChars count]) {      
     [uButton setTitle: @"" forState: UIControlStateNormal]; 
    } else { 

     NSString *value = [[NSString alloc] initWithFormat:@"%@", [self.arrChars objectAtIndex:iArrPos]]; 
     NSLog(@"%@", value); 

     [uButton setTitle: [[NSString stringWithFormat:@"%@", value] forState: UIControlStateNormal]; 

     [value release]; 

     //////Have tried: 
     //////[uButton setTitle: value forState: UIControlStateNormal]; 

     //////Have also tried: 
     //////[uButton setTitle: [self.arrChars objectAtIndex:iArrPos] forState: UIControlStateNormal]; 

     //////Have also also tried: 
     //////[uButton setTitle: [[self.arrChars objectAtIndex:iArrPos] autorelease] forState: UIControlStateNormal]; 
    } 

    [uButton setAlpha:1]; 
} 

При установке Названия одной кнопки не представляется, autoreleasing прежнего названия и распределение идет вверх и вверх. Что я делаю не так?

Мне сказали, что отслеживание вещей по распределению - это плохой способ преследовать утечки, потому что, насколько я вижу, объект не протекает в Инструментах, но мои общие жизненные ассигнования продолжают расти, пока я не получу предупреждение о памяти , Если есть лучший способ отслеживать там, я хотел бы знать.

Update

Забыл упомянуть, что вместо использования значения я извлекать из моего массива я просто установить заголовок @ «Test» - это нормально, и нет бесконечного увеличения каждый раз, когда я изменить стр.

ответ

0

После долгих ночей я решил укусить пулю и отправить ее в DTS от Apple.

Хотя ответ был полезен, это было не то, что я надеялся. Внутри arrChar были иногда глифы, которые при загрузке, как мне сказали, не разгружаются. Полное объяснение:

Насколько я знаю, iOS не выгружает глифы после того, как они были загружены в память. Вот почему вы видите в Instrument.app выделение памяти увеличивается при загрузке новых символов и остается плоской, когда вы возвращаетесь и переходите позже. Это в значительной степени дизайн iOS, который мы ничего не можем изменить. Если вы действительно хотите контролировать использование памяти, вы можете поочередно превращать символы в изображения и использовать UIImage (imageWithContentsOfFile :) для загрузки и выпуска.

Надеюсь, что это поможет кому-то там.

0

Вы делаете много ненужного создания и форматирования строк. Вы можете заменить эти строки:

NSString *value = [[NSString alloc] initWithFormat:@"%@", [self.arrChars objectAtIndex:iArrPos]]; 
NSLog(@"%@", value); 

[uButton setTitle: [[NSString stringWithFormat:@"%@", value] forState: UIControlStateNormal]; 

с этим:

NSString *title = [self.arrChars objectAtIndex:iArrPos]; 

[uButton setTitle:title forState:UIControlStateNormal]; 
[title release]; 

Использование setTitle: на title увеличивает сохранить кол - обязательно release это после.

+0

Спасибо. Я только недавно добавил, что, поскольку я думал, что это даст мне возможность освободить память, а не полагаться на авторекламу. Что касается добавления stringValue, это теперь сбой моего кода ('- [__ NSCFString stringValue]: нераспознанный селектор, отправленный экземпляру 0x1c13d0') - означает ли это, что мой plist настроен неправильно как строки? – Ralphonzo

+0

Я изменил этот раздел на 'stringWithFormat'. Какие типы объектов хранятся в 'self.arrChars'? – mopsled

+0

Массив загружается следующим образом: self.arrChars = [[NSArray alloc] initWithContentsOfFile: [[[NSBundle mainBundle] bundlePath] stringByAppendingString: @ "/ chars.plist"]]; и содержит комбинацию символов (некоторые специальные символы).Структура: .... так далее ... Ralphonzo

Смежные вопросы