Утечка памяти из-за использования сохранения свойств - PullRequest
2 голосов
/ 28 апреля 2011

Почти во всех моих классах я использую свойства и всегда использую свойства сохранения, как это:

@property (nonatomic, retain) HomeViewController *homeViewController;

И в файле реализации я создаю эти свойства следующим образом:

self.homeViewController = [[HomeViewController alloc]init];

и это единственное место, которое я освобождаю:

- (void)dealloc
{
    [homeViewController release];
    [super dealloc];
}

Правильно ли я считаю, что у меня здесь утечка памяти - потому что счет сохранения будет на самом деле 2. Первое происходит от свойства retain ивторой приходит из вызова alloc?

Если да, должен ли я использовать метод assign при этих обстоятельствах?

Ответы [ 3 ]

6 голосов
/ 28 апреля 2011

Да, у вас есть утечка, и да, ваш счет удержания равен 2.

Три решения:

  • self.homeViewController = [[[HomeViewController alloc]init] autorelease];
  • homeViewController = [[[HomeViewController alloc]init];
  • UIViewController *temp = [[HomeViewController alloc]init]; self.homeViewController = temp; [temp release];
2 голосов
/ 28 апреля 2011

Да, у вас есть утечка памяти. Это можно исправить следующим образом:

self.homeViewController = [[[HomeViewController alloc]init] autorelease];

Синтезирование свойства, которое сохраняется, создает установщик, который действует следующим образом:

- (void)setHomeViewController(HomeViewController *)aHomeViewController
{
    if (![homeViewController isEqual:aHomeViewController]) {
        [homeViewController release];
        homeViewController = aHomeViewController;
        [homeViewController retain];
    }
}

Синтезированный установщик освобождает старое значение свойства и сохраняет новое значение. Таким образом, ваша переменная alloc'а сохраняется дважды: в alloc & в установщике свойств. Затем он освобождается только один раз, в сделке.

Примечание. Я исправил приведенный выше код в соответствии с комментариями jv42 и JeremyP. Синтезированный установщик сначала эффективно проверяет, что новое значение и старое значение не указывают на один и тот же объект. Без проверки этого (как у меня было изначально) он может освободить объект HomeViewController и потерять его перед установкой свойства.

0 голосов
/ 28 апреля 2011

Вы также можете использовать self.yourObject = nilviewDidUnload метод.

...