Почему этот код вызывает утечку памяти?

Инструмент Leaks в Xcode показывает мне здесь утечку памяти. Я прокомментировал затронутую строку, на которую жалуется Leaks. Но я не вижу ошибки в управлении памятью...

- (void)setupViewController {
    MyViewController *myVC = [[MyViewController alloc] init];

    UITabBarItem *tbi = [[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemDownloads tag:1];
    myVC.tabBarItem = tbi; // LEAK: 128 bytes

    self.myViewController = myVC;

    [myVC release];
    [tbi release];
}

Я имею в виду... tbi и myVC высвобождаются в конце, а alloc сбалансирован. Так что же не так? Я не понимаю.


person dontWatchMyProfile    schedule 15.02.2010    source источник


Ответы (2)


если MyVc.tabBarItem уже установлен, все, на что он указывает, может быть не освобождено должным образом, что приведет к утечке.

person patros    schedule 15.02.2010
comment
Свойство tabbar myVC должно быть свойством, определенным для сохранения. Если вы сделаете это, сохранение объектов, назначенных свойству, будет поддерживаться автоматически. - person TechZen; 15.02.2010
comment
хорошо, но tabBarItem от Apple, а не от меня ;-) Я не создавал никакого свойства tabBarItem для моего контроллера представления. Apple сделала. Было бы нарушением правил управления памятью, если бы я вручную выпустил myVC.tabBarItem только потому, что Apple забыла это сделать, не так ли? - person dontWatchMyProfile; 16.02.2010
comment
tabBarItem — это свойство с семантикой retain. Очень маловероятно, что в сеттере есть утечка. - person Nikolai Ruhe; 10.07.2010

Это просто показывает, что по крайней мере одно из следующих утверждений верно:

  1. Приборы не идеальны и иногда показывают утечки там, где их нет (и наоборот).
  2. Код Apple не свободен от ошибок.

На самом деле оба верны.

person Ole Begemann    schedule 15.02.2010