IOS 4.3 UINavigationBar tintColor Leaks - PullRequest
       1

IOS 4.3 UINavigationBar tintColor Leaks

10 голосов
/ 21 марта 2011

В IOS4.3, если я установлю

navigationBar.tintColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1];

Я получу утечку памяти: утечка UIDeviceRGBColor

Но если я использую navigationBar.tintColor = [UIColor blackColor]; Все хорошо.

Этого никогда не случалось в ios4.2

Я сделал некоторую отладку и обнаружил, что [navigationBar.tintColor retainCount] кажется больше, если я использую

[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1];

У кого-нибудь есть такая же проблема?

Это код утечки:
В RootViewController:

- (void)viewWillAppear:(BOOL)animated { 
        self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0];
        [super viewWillAppear:animated];
    } 

В DetailViewController:

- (void)viewWillAppear:(BOOL)animated {
        self.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0.9 green:0 blue:0 alpha:0];
        [super viewWillAppear:animated];
    } 

Если вы перейдете к DetailViewController, затем вернитесь к RootViewController в Инструментах, вы можете увидеть утечку UIDeviceRGBColor

Ответы [ 5 ]

3 голосов
/ 16 октября 2011

У меня была эта проблема до 4.2, я думаю, что colourWithRed: Green: blue выделяет новый объект UIColor, за который вы отвечаете.

Решение состоит в том, чтобы создать экземпляр для вашего оттенка и отпустить его, когда вы закончите с вашим контроллером навигации в viewDidUnload.

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    tintBarColor = [UIColor   
                colorWithRed:50.0/255   
                green:134.0/255   
                blue:187.0/255   
                alpha:1];
    self.navigationController.navigationBar.tintColor = tintBarColor;
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    [tintBarColor release];
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on     demand.
    // For example: self.myOutlet = nil;
}
2 голосов
/ 28 сентября 2011

Я тоже вижу ту же проблему.Я отправил сообщение об ошибке в Apple, и буду публиковать обновления по мере их поступления.

Я нашел обходной путь.Проблема заключается в вызове self.navigationController.navigationBar.tintColor.Но если вы установите цвет оттенка для другого UIViewController, у вас не будет той же проблемы.Например, это не похоже на утечку:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithStyle:UITableViewStyleGrouped];
    detailViewController.navigationController.navigationBar.tintColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1];
    [self.navigationController pushViewController:detailViewController animated:YES];
    [detailViewController release];
}

К сожалению, это не помогает тем из нас, кто использует платформу Three20 = (

ОБНОВЛЕНИЕ: Я слышал от Apple.Они сказали, что об этом уже сообщили, и они изучают проблему.

1 голос
/ 22 марта 2011

Во-первых, не используйте retainCount.Это бесполезно.

Далее, откуда вы знаете, что у вас есть утечка?Вы использовали инструменты?Наконец, вы включили сохранение отслеживания событий в инструменте распределения и посмотрите, куда отправляются все удержания / релизы?

+blackColor является синглтоном.Таким образом, вы, вероятно, тоже это утечка, но есть только один, и утечки не найдут его, так как на него ссылается глобал.

Что касается вашей утечки, то не имеет значения, происходит ли это тольков iOS 4.3 против 4.2.Утечка - это утечка.Хотя есть вероятность, что это в рамках Apple, это маловероятно.Однако, если это так, то сообщение об ошибке высоко ценится.

Кроме того, используйте инструмент Allocations, чтобы увидеть, аккрецируете ли вы другие объекты, которые не обнаруживаются как утечки (но все же не должны быть рядом).Утечка обнаруживает только объекты, на которые нет ссылок, но есть много других способов утечки памяти!

0 голосов
/ 31 марта 2011

Я могу подтвердить ту же утечку в моем коде - нет утечки, сообщенной в 4.2, и утечка появляется в 4.3

0 голосов
/ 21 марта 2011

Попробуйте использовать Build and Analyze (или Analyze в Xcode 4) и убедитесь, что у вас нет утечек в первую очередь.) Если проблема сохраняется, отправьте отчет об ошибке в Apple.

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