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