2010-11-18 10 views
0

Mon code se bloque avec un mauvais accès, quand j'ai une vue avec des tables. J'ai compris quel est le problème, mais je cherche la bonne solution.iphone xcode; libérant une instance de vue écrasant la table avec la source de données

View 1 - j'ai un bouton qui crée et instance de vue 2, puis le libère, quelque chose comme ceci:

settingsScreen *settings = [[settingsScreen alloc] initWithNibName:@"settingsScreen" bundle:nil]; 
    CGRect theFrame = settings.view.frame; 
    //theFrame.origin = CGPointMake(self.view.frame.size.width, 0); 
    theFrame.origin = CGPointMake(0,-(self.view.frame.size.height)); 
    settings.view.frame = theFrame; 
    theFrame.origin = CGPointMake(0,0); 
    [UIView beginAnimations:nil context:nil]; 
    [UIView setAnimationDuration:0.8f]; 
    settings.view.frame = theFrame; 
    [UIView commitAnimations]; 
    [self.view addSubview:settings.view]; 
    [settings release]; 

Vu 2 il y a table, où je suis en train de la source de données et délégué à moi-même sur viewDidLoad, mais cela bloque l'application avec exec_bad_access

Si je supprime [version des paramètres] dans la vue 1, tout va bien.

Si je ne libère pas la vue, n'est-ce pas mal de la laisser en mémoire?

comment puis-je surmonter cette situation?

Merci

Répondre

0

vous devez utiliser soit pushViewController ou presentModalViewController au lieu d'ajouter une vue d'un viewController dans un autre viewController et quand vous voulez revenir vous pouvez utiliser popViewController ou dismissModalViewController, ce qui contribue à la gestion de la mémoire ainsi. Utilisez également [NSBundle mainBundle] pour le paramètre bundle dans initWithNibName qui trouve le xib approprié dans le bundle.

Je suis sûr que votre instance de paramètres est de nouveau publiée quelque part dans votre code et que votre application est instable.

+0

Très bien, merci pour les réponses. – Veeru

+0

si j'utilise autorelease, je rencontre toujours des problèmes similaires. Désolé pour la question boiteuse, si je veux utiliser le contrôleur presentModalView, sans un contrôleur de navigation, quelle est la hiérarchie? Fenêtre -> Afficher le contrôleur -> Afficher? un exemple que je peux être pointé? – Veeru

+0

Vous pouvez également appeler presentModalViewController à l'aide de l'instance viewControllers. – Sanniv

0

La réponse de Sanniv est correcte. Vous devez utiliser le concept push-pop de navigation controller ou présenter le contrôleur de manière modale. (Visitez: i) http://forums.macrumors.com/showthread.php?t=472236 & ii) http://www.iphonedevsdk.com/forum/iphone-sdk-development/3643-pushviewcontroller-versus-presentmodalviewcontroller.html pour plus d'informations).

Maintenant, l'erreur que vous obtenez est parce que votre "paramètres" objet est utilisé dans l'animation que vous libérez avant que votre animation se termine. Ainsi, au lieu de relâcher l'objet immédiatement, relâchez-le dans une autre méthode qui serait appelée exactement après l'arrêt de l'animation. Comme suit ainsi:

settingsScreen *settings = [[settingsScreen alloc] initWithNibName:@"settingsScreen" bundle:nil]; 
CGRect theFrame = settings.view.frame; 
//theFrame.origin = CGPointMake(self.view.frame.size.width, 0); 
theFrame.origin = CGPointMake(0,-(self.view.frame.size.height)); 
settings.view.frame = theFrame; 
theFrame.origin = CGPointMake(0,0); 

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationDuration:0.8f]; 
[UIView setAnimationDidStopSelector:@selector(releaseObjects)]; 

settings.view.frame = theFrame; 
[self.view addSubview:settings.view]; 

[UIView commitAnimations]; 

Dans la méthode des objets « de releaseObjects », vous devez libérer vos paramètres objet. Et dans un cas, si votre objet paramètres est un local, faites-le autorelease comme ceci -

settingsScreen *settings = [[[settingsScreen alloc] initWithNibName:@"settingsScreen" bundle:nil] autorelease]; 
Questions connexes