Использование собственной точечной нотации не вызывает dealloc - PullRequest
0 голосов
/ 27 марта 2011

Метод dealloc моего класса контроллера представления не вызывается при извлечении после нажатия следующего кода:

    self.playerViewController = [[VideoPlayerViewController alloc] init];

[self.playerViewController set_video:video];

    [self.navigationController pushViewController:self.playerViewController animated:YES];

[self.playerViewController release];

Тем не менее, если я изменю push-код на следующий, то после освобождения контроллера представления мой dealloc будет вызываться соответствующим образом:

    playerViewController = [[VideoPlayerViewController alloc] init];

[playerViewController set_video:video];

[self.navigationController pushViewController:playerViewController animated:YES];

[playerViewController release];

Я думал, что понял использование точечной нотации / себя, но, очевидно, нет. Кто-нибудь может объяснить проблему здесь?

Вот свойство:

@property (nonatomic, retain) VideoPlayerViewController *playerViewController;

и вот синтез:

@synthesize playerViewController;

1 Ответ

3 голосов
/ 27 марта 2011

Вы удерживаете дважды.

self.playerViewController = [[VideoPlayerViewController alloc] init];
    ^ retain + 1                                        ^^^^^ retain + 1

Но вы отпускаете только один раз.

Чтобы исправить проблему управления памятью, вы можете изменить код на что-то вроде этого:

self.playerViewController = [[[VideoPlayerViewController alloc] init] autorelease];

И многие люди говорят, что [self.foo release] это плохой стиль. Вы должны рассмотреть вопрос о замене его на [foo release]

...