2009-12-18 4 views
0

Je développe une application iphone et j'ai un petit problème dessus. Je suis en utilisant des méthodes de l'appelant pop-up dans mon fichier appdelegate.m beugler comme çaLa méthode dealloc appelle trois fois, pendant l'exécution

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

Et j'appelle ces méthodes à l'intérieur de vues comme celle

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

Et ces vues d'aide et ouvre vues communiquant via NSNotificationCenter. Mon problème est comme vous pouvez le voir "OpenInfo" et "OpenNetworkSelection" méthodes contient des logiques de création d'instance de vue. Lorsque j'ai appelé la méthode OpenInfo, cela fonctionne parfaitement comme il se doit. Mais "OpenNetworkSelection" ne fonctionne pas il lance quand j'ai essayé la deuxième fois *** - [UIButton release]: message envoyé à l'erreur désaffectée instance 0x3dbdb50.

Ok, je l'ai compris. Ensuite, je mets NSlog ligne dans la surcharge Dealloc de NetworkSelection.m
et OpenInfo.m fichiers, car j'ai besoin de différences de comportements. Par conséquent, les méthodes OpenInfo dealloc fonctionnent lorsque la vue est fermée (je veux dire supprimé de superview). Mais la méthode dealloc de NetworkSelection s'exécute trois fois. Je n'ai pas trouvé de source de problème. Est-ce que quelqu'un peut me dire ce que je fais mal?

Merci

Edit:

Les gars, je l'ai trouvé quelque chose de mal dans mon contrôleur de vue NetworkSelection. Plus de description est; J'ai vu ces lignes de code dans mon viewcontroller.

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

Dans ces lignes de code que je fais des appels de serveur async, quand je commentais ces lignes, mon viewcontroller a parfaitement fonctionné, alors j'ai créé méthode « LoadDataFromServer » et je suis passé par exemple CommonGateway de source qui appdelage comme ça

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

Mon code d'appdelegate est remplacé par;

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

Mais même résultat, si je en commentaire "[self.networkselection LoadDataFromServer];" ligne alors ça marche. Et ma classe CommonGateway notifier à l'appelant via NSNotificationCenter.

Je pense que cela donnera plus d'indices pour résoudre le problème.

Merci encore

+0

En supposant que networkselection et infoDetail sont définis avec @property (retenez) le code que vous avez affiché semble correct. Nous avons besoin de plus d'informations sur les différences dans les deux contrôleurs pour aider. – deanWombourne

+0

Pourquoi j'utilise ces appels de méthode sur l'appdelegate? parce que j'ai besoin d'ouvrir mes vues sur l'ensemble de l'application. – fyasar

+0

Non, l'appel de ces méthodes à partir du délégué de l'application devrait être bon - je le fais tout le temps et c'est la bonne chose à faire. Quelque part il doit y avoir une différence dans le nombre de fois que vous appelez release sur l'objet - mettre un point d'arrêt sur la méthode dealloc et regarder les traces de la pile que vous obtenez, cela devrait vous donner une idée de l'endroit où chercher? – deanWombourne

Répondre

4

Vous libérez detail ici:

[detail release]; 

Et vous essayez de l'utiliser immédiatement après:

[window addSubview:detail.view]; 

Votre application se bloque parce que vous avez sorti detail mais vous avez encore essayé d'accéder à ses propriétés (maintenant inexistantes).

Vous pouvez utiliser, à la place, votre Ivars, .: par exemple

[window addSubview:self.infoDetail.view]; 

Ou:

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

Vous pouvez vouloir lire Apple Memory Management Programming Guide.

+0

Ils pointent tous deux sur le même objet, donc peu importe si vous utilisez detail ou self.infoDetail, ils sont tous les deux le même objet (qui est toujours conservé si self.infoDetail est défini comme une propriété avec retain set) . – deanWombourne

+0

Alex, merci pour votre réponse rapide. J'ai essayé votre suggestion avant, c'est comme ça - (void) OpenInfo { \t InfoDétail * detail = [[InfoDetail alloc] initWithNibName: @ "InfoDetail" bundle: nil]; \t self.infoDetail = detail; \t [version de détail]; \t [fenêtre addSubview: self.infoDetail.view]; } - (void) OpenNetworkSelection { \t NetworkSelection * netsel = [[NetworkSelection alloc] initWithNibName: @ Groupe "NetworkSelection": nil]; \t self.networkselection = netsel; \t [libération de netsel]; \t [fenêtre addSubview: self.networkselection.view]; } Le résultat est la même erreur. – fyasar

+0

Si vous libérez un objet, il ne peut plus pointer vers quelque chose d'utile. Ce qui, en effet, est confirmé par l'erreur "message envoyé à l'instance désaffectée". Puisque l'ivar ('infoDetail') en prend possession, il devrait plutôt être utilisé. –

0

Si vous recevez un appel à dealloc trois fois, cela suggère que vous avez trois instances de la même classe au lieu d'une. Vous devez définir un point d'arrêt dans le dealloc et vérifier l'adresse de l'instance pour voir si elle est la même à chaque fois. Je soupçonne que ce ne sera pas le cas.

Toutefois, si vous n'avez pas appelé [super dealloc] lorsque vous avez ignoré dealloc, il est possible que l'objet ne soit pas réellement désalloué mais qu'il libère simplement son iVars. Dans ce cas, le système peut appeler le dealloc de la même instance à plusieurs reprises tout en essayant de le tuer.

+0

TechZen merci pour votre message, il m'a donné une idée de mes codes, puis j'ai trouvé mon problème comme je l'ai décrit – fyasar

0

Les gars j'ai trouvé ma source de problème. problème exactement à l'intérieur de la mise en œuvre de la classe CommonGateway Dans cette classe j'utilise constructeur qui

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

}

Mais cette ligne ne va pas, bacause j'utilise cette classe CommonGateway beaucoup de place mon projet. Quand je l'ai changé

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

à

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

Il fonctionne à nouveau.

Les gars, merci beaucoup pour votre soutien.

+1

Vous devez sélectionner la coche à côté de cette réponse afin que le système sache que la question a été résolue. – TechZen

Questions connexes