Метод dealloc вызывается три раза, во время выполнения - PullRequest
0 голосов
/ 18 декабря 2009

Я разрабатываю приложение для iphone, и у меня небольшая проблема. Я использую методы вызова всплывающих окон в моем файле appdelegate.m ниже, как это

-(void)OpenInfo{
    InfoDetail *detail = [[InfoDetail alloc] initWithNibName:@"InfoDetail" bundle:nil];
    self.infoDetail = detail;
    [detail release];
    [window addSubview:detail.view];
 }

-(void)OpenNetworkSelection{
    NetworkSelection *netsel = [[NetworkSelection alloc] initWithNibName:@"NetworkSelection" bundle:nil] ;
    self.networkselection = netsel;
    [netsel release];
    [window addSubview:netsel.view];
 }

И я вызываю эти методы изнутри таких представлений

StatusFoxAppDelegate *delegate = (StatusFoxAppDelegate*)[[UIApplication sharedApplication] delegate];
[delegate OpenInfo];    

И эти вспомогательные представления и открывающие представления взаимодействуют через NSNotificationCenter.

Моя проблема в том, что вы видите, что методы "OpenInfo" и "OpenNetworkSelection" содержат логику создания экземпляра представления.

Когда я вызывал метод OpenInfo, он работал идеально, как и должно быть. Но «OpenNetworkSelection» не работает, он выбрасывает, когда я пытался второй раз *** - [UIButton release]: сообщение отправлено на освобожденный экземпляр 0x3dbdb50 error.

Хорошо, я понял это. Затем я помещаю строку NSlog в перегрузку Dealloc NetworkSelection.m
и файлы OpenInfo.m, потому что мне нужны различия в поведении.

Итак, методы OpenInfo dealloc работают, когда представление закрывается (я имею в виду удаление из суперпредставления). Но метод dealloc NetworkSelection выполняется три раза. Я не нашел источника проблемы.

Может кто-нибудь сказать мне, что я делаю не так?

Спасибо

Редактировать:

Ребята, я обнаружил, что что-то не так в моем контроллере просмотра NetworkSelection. Больше описания есть; я видел эти строки кода в моем viewcontroller.

    CommonGateway *gw = [[CommonGateway alloc] InitWithDefaults];
self.gateway = gw;
[self.gateway GetAvailableNetworkList];
[self.gateway setCommDelegate:self];
[gw release];   

В этих строках кода я выполняю асинхронные вызовы сервера, когда я закомментировал эти строки, мой viewcontroller работал отлично, затем я создал метод «LoadDataFromServer» и передал экземпляр CommonGateway из источника, который appdelage, как этот

- (void)LoadDataFromServer{
CommonGateway *gw = [[CommonGateway alloc] InitWithDefaults];
self.gateway = gw;
[self.gateway GetAvailableNetworkList];
[self.gateway setCommDelegate:self];
[gw release];   
   }

Код моего приложения изменен на;

-(void)OpenNetworkSelection{
NetworkSelection *netsel = [[NetworkSelection alloc] initWithNibName:@"NetworkSelection" bundle:nil] ;
self.networkselection = netsel;
self.networkselection.gateway = commonGateway;
[netsel release];
[window addSubview:self.networkselection.view];
[self.networkselection LoadDataFromServer];
  }

Но результат тот же, если я закомментирую "[self.networkselection LoadDataFromServer];" линия тогда работает. И мой класс CommonGateway уведомляет вызывающего абонента через NSNotificationCenter.

Я думаю, это даст больше подсказок для решения проблемы.

Еще раз спасибо

Ответы [ 3 ]

4 голосов
/ 18 декабря 2009

Вы отпускаете detail здесь:

[detail release];

А потом вы пытаетесь использовать его сразу после этого:

[window addSubview:detail.view];

Ваше приложение аварийно завершает работу, потому что вы выпустили detail, но все еще пытались получить доступ к его (теперь несуществующим) свойствам.

Так что вы можете использовать вместо этого свои ивары, например ::

[window addSubview:self.infoDetail.view];

Или:

[window addSubview:[self.infoDetail view]];

Возможно, вы захотите прочитать руководство по управлению памятью Apple .

0 голосов
/ 18 декабря 2009

Ребята, я нашел источник моей проблемы. Проблема именно внутри реализации класса CommonGateway В этом классе я использую конструктор, который

-(id)InitWithDefaults{
self = [super init];
NSOperationQueue *_queue = [[[NSOperationQueue alloc] init] autorelease];
self.queue = _queue;
[_queue release];
return self;

}

Но эта строка неверна, потому что я использую этот класс CommonGateway во многих местах моего проекта. Когда я изменился

NSOperationQueue *_queue = [[[NSOperationQueue alloc] init] autorelease];

до

NSOperationQueue *_queue = [[NSOperationQueue alloc] init];

Это снова работает.

Ребята, большое спасибо за вашу поддержку.

0 голосов
/ 18 декабря 2009

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

Однако, если вы не сделали вызов [super dealloc], когда переопределили dealloc, возможно, объект на самом деле не освобожден, а просто освобождает свои iVars. В этом случае система может повторно вызывать dealloc одного и того же экземпляра при попытке уничтожить его.

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