IOS 4.3 UINavigationBar tintColor Leaks

В 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

Ответ 1

У меня была эта проблема до 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

Я также вижу ту же проблему. Я подал ошибку с 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. Они сказали, что уже сообщили, и они изучают этот вопрос.

Ответ 3

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

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


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

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

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

Ответ 4

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

Ответ 5

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