Правильно ли освободить viewController, который устанавливает его в качестве делегата для других классов? - PullRequest
1 голос
/ 28 апреля 2011

Первое, что я делаю, это создаю ViewController и отправляю его в Navigation Controller.

viewController = [[MyViewController alloc] init];
[navController pushViewController:viewController animated: NO];
[viewController release];

Количество сохранений теперь равно 2 (pushViewController использует 2, очевидно, но я не отвечаю за это) пока что все в порядке.

Внутри MyViewController я создаю экземпляр класса и задаю ViewController как делегат экземпляру.

timer = [[MyBackgroundTimer alloc] initWithInterval:20];
[timer setDelegate:self];

Теперь количество сохраненных viewControllers увеличилось на 1, поскольку setDelegate:

Но когда я выпускаю viewController позже, он никогда не вызовет dealloc, потому что у меня есть еще один счетчик сохранения.

Как правильно сбросить счетчик хранения, когда вы устанавливаете себя в качестве делегата?

Ответы [ 2 ]

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

Не оставляйте своего делегата.Если вы используете свойство, определите свой делегат как назначить, а не сохранить.Кто-то другой должен сохранить ваш делегат, а не вы.

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

Ваш класс MyBackgroundTimer должен иметь свойство делегата в качестве assign и не сохранять.

@property (nonatomic, assing) id delegate;

И этот класс должен сохранить делегата именно тогда, когда ему нужно его использовать, и освободить, когда это будет сделано.

@implementation MyBackgroundTimer 

@synthesize delegate;

-(void) startTimer {

    [self.delegate retain];

    //... do some actions

}


-(void) timerStopped {

    //... call delegate methods

    [self.delegate release]

}

@end

Важно помнить, что вы можете иметь своего делегата в качестве сохраняемого свойства. Но чтобы сделать это правильно, вы должны убедиться, что вы освободили его до вызова dealloc (как метод timerStopped в приведенном выше примере)

Я говорю это потому, что если вы попытаетесь освободить делегат в методе dealloc, класс, который создает экземпляр MyBackgroundTimer, будет того же класса, что и делегат, и он также выпустит MyBackgroundTimer в dealloc (что в значительной степени в общем случае), метод dealloc обоих классов никогда не будет вызван, поскольку каждый класс будет владеть другим, что приведет к утечке памяти (которая будет не отображаться на приборах).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...