2009-12-18 2 views
0

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

-(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.

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

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

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

Спасибо

Edit:

Ребята, я нашел что-то неправильно в мой взгляд NetworkSelection контроллер. Больше описания; Я видел эти строки кода в моем контроллере view.

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]; 
    } 

Мое изменение appendlegate;

-(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.

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

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

+0

Предполагая, что networkselection и infoDetail определены с помощью @property (сохранить), код, который вы установили, выглядит отлично. Нам нужна дополнительная информация о различиях в двух контроллерах. – deanWombourne

+0

Почему я использую эти вызовы методов для appdelegate? потому что мне нужно открыть мои взгляды на все приложение. – fyasar

+0

Нет, вызов этих методов из делегата приложения должен быть прекрасным - я делаю это все время, и это правильная вещь. Где-то должно быть различие в количестве раз, когда вы вызываете выпуск на объекте - поместите точку останова на метод dealloc и посмотрите на трассировки стека, которые вы получаете, это должно дать вам ключ, где искать? – deanWombourne

ответ

4

Вы освобождаете detail здесь:

[detail release]; 

И тогда вы пытаетесь использовать его сразу же после этого:

[window addSubview:detail.view]; 

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

Таким образом, вы можете использовать, вместо того, чтобы ваши Ивар и т.д .:

[window addSubview:self.infoDetail.view]; 

Или:

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

Вы можете прочитать от Apple Memory Management Programming Guide.

+0

Они оба указывают на один и тот же объект, поэтому не имеет значения, используете ли вы детали или self.infoDetail, они оба являются одним и тем же объектом (который все еще сохраняется, если self.infoDetail определяется как свойство с сохранением набора) , – deanWombourne

+0

Алекс, спасибо за ваш быстрый ответ. Я пробовал ваше предложение раньше, это так - (void) OpenInfo { \t InfoDetail * detail = [[InfoDetail alloc] initWithNibName: @ "InfoDetail" bundle: nil]; \t self.infoDetail = detail; \t [подробный выпуск]; \t [window addSubview: self.infoDetail.view]; } - (void) OpenNetworkSelection { \t NetworkSelection * netsel = [[NetworkSelection alloc] initWithNibName: @ "NetworkSelection" bundle: nil]; \t self.networkselection = netsel; \t [netsel release]; \t [window addSubview: self.networkselection.view]; } Результат такой же ошибки. – fyasar

+0

Если вы отпустите объект, он больше не может указывать на что-либо полезное. Это, действительно, подтверждается ошибкой «сообщение, отправленное на освобожденный экземпляр». Так как ivar ('infoDetail') переходит в собственность, он должен использоваться вместо этого. –

0

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

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

+0

TechZen благодарит вас за сообщение, он дал мне представление о моих кодах, затем я нашел свою проблему, как я описал. – fyasar

0

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

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

}

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

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

в

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

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

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

+1

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

Смежные вопросы