Вызов UIViewController и никогда не освобождается - PullRequest
0 голосов
/ 01 марта 2012

У меня есть класс OTNetwork, который является подклассом UIViewController.

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

OTNetwork *net = [[OTNetwork alloc] initWithNibName:@"OTNetwork" bundle:nil];

[self presentModalViewController:net animated:YES];

[net release];

Когда пользователь хочет выйти, нажимает кнопку, и объект OTNetwork отправляет уведомление, которое заставляет вызывающую программу ViewController отклонить контроллер представления. Это код:

[self dismissModalViewControllerAnimated:YES];

Моя проблема в том, что метод dealloc объекта OTNetwork никогда не вызывается. И вот недействительный вызов таймера, который никогда не останавливается. Дополнительная проблема - утечка памяти.

В вызывающем View Controller этот объект создается и удаляется только этими строками кода.

Любая помощь, пожалуйста?

Заранее спасибо!.

Ответы [ 3 ]

1 голос
/ 01 марта 2012

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

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
try{
//your code for allocating that object
 OTNetwork *net = [[[OTNetwork alloc] initWithNibName:@"OTNetwork" bundle:nil] autorelease]; [self presentModalViewController:net animated:YES];
}
finally{
[pool drain];
}
1 голос
/ 02 марта 2012

Авто-релиз никогда не гарантирует, когда будет вызван dealloc, и вы не должны на это полагаться.

И пулы авто-релиза должны использоваться для потоков или когда у вас большой объем памяти в замкнутом цикле.Его не следует использовать в главном потоке, который уже выполняется в отдельном пуле.

Вероятно, вам следует переместить вызов таймера недействительности в viewDidUnload или viewWillDisappear в классе OTNetwork.

Надеюсь, это поможет.

[Обновление: 02 марта 2012 г.]

Если вы хотите убедиться, что вызывается dealloc, попробуйте следующее

1) Сохраните ссылку на контроллер OTNetwork

OTNetwork *net = [[OTNetwork alloc] initWithNibName: @"OTNetwork" bundle: nil];
net.delegate = self;
self.modalV = net; // @property (nonatomic, strong) OTNetwork *modalV;
[net release];

[self presentModalViewController: modalV animated: YES];

2) Определить протокол / делегат в OTNetwork для отчета о его закрытии

// .h
@protocol OTNetworkDelegate;
    - (void) netViewClosed;
@end

// .m
- (void) viewDidUnload
{
    [self.delegate netViewClosed];
}

3) В mainViewController реализовать протокол

- (void) netViewClosed
{
    if(modalV)
    {
        [modalV release], modalV = nil;
    }
}
1 голос
/ 01 марта 2012

когда вы передаете свой объект OTNetwork самому себе, который, как я предполагаю, является навигационным контроллером, тогда ваш объект OTNetwork находится в пуле релизов, и вам не нужно беспокоиться об его освобождении, так как ваш код хорош для управления памятью .

Итак, короткий ответ, в пуле авто-релиза

...