2011-05-27 3 views
1

Hey, J'ajoute un UIViewcontroller comme sous-vue de ma vue actuelle. Avec quelque chose comme ça:Libérer UIViewController si disponible

[self.view addSubview:viewcontroller.view]; 

L'utilisateur peut interagir avec cette ajouté viewcontroller donc je ne peux pas libérer juste après je l'ai ajouté est vue comme mon sous-vue, non? Donc je voudrais le libérer la méthode de dealloc et le mettre à zéro dans viewDidUnload quand mon maître viewcontroller est déchargé, non?

Le problème est que le viewcontoller que j'ajoute en tant que sous-vue n'est pas ajouté à chaque fois. Donc la question est, comment puis-je ceck si le viewcontroller a été ajouté comme sous-vue et si oui, le libérer.

Merci beaucoup! Sebastian

Répondre

2

Vous pouvez le vérifier comme ceci:

if(viewController)  
{ 
[viewController release]; 
viewController=nil; 
} 

et oui u besoin de mettre dans votre méthode dealloc.

+0

Merci beaucoup pour votre aide rapide. Suny était le premier ... Je savais qu'il y avait une solution simple, comme d'habitude :) – wolfrevo

+1

vous pouvez omettre le contrôle 'if (viewController)', car dans ObjC, vous pouvez envoyer des messages à des objets nil sans problèmes. – sergio

+0

oui je suis conscient du message envoyant à nil objets mais dans ce cas je dois mettre un chèque parce que si le développeur n'a pas assigné nil au viewcontroller alors il va prendre une certaine valeur de garbage et envoyer alors n'importe quel message à une valeur de garbage conduira à un crash douloureux .. Au moins c'est ce que je sais..cheers .. !! – Suny

1

Dans un code open source auquel j'ai contribué, nous avions une macro appelée RELEASE_TO_NIL qui faisait exactement cela.

#define RELEASE_TO_NIL(obj) if(obj != nil) { [obj release]; obj = nil; } 

Vous l'utiliser comme ceci:

RELEASE_TO_NIL(viewController); 

simple que cela.

0

Ajoutez simplement une balise à viewController.view et testez si self.view contient cette balise.

UIView *testView = [self.view viewWithTag:yourTag]; 
if(testView!=nil){ 
    doStuff; 
} 
0

Selon les docs Apple, une instance UIViewController doit gérer une vue qui remplit tout l'écran. Si votre vue ne remplit pas l'écran, vous pouvez sous-classer UIView pour gérer la délégation ou faire en sorte que le superviseur fonctionne en tant que délégué.

De même, les sous-vues d'une vue sont contenues dans une instance de NSArray, [myView subviews] pour renvoyer cette propriété. Demandez au tableau retourné s'il contient la sous-vue en question et vous pouvez le libérer en conséquence. Mais, sans en savoir plus, il semble que vous ayez besoin de repenser la façon dont vous configurez tout cela.

2

Si vous avez bien lu votre code:

[self.view addSubview:viewcontroller.view]; 

il est le contrôleur qui est ajouté en tant que sous-vue, plutôt la vue qu'elle gère.

Ceci est un point important, car cela signifie que le contrôleur lui-même n'est pas retenu. Ce qui est retenu est la vue.

Alors vous pouvez simplement aller libérer votre viewController dans -dealloc comme d'habitude:

-(void)dealloc { 
    [viewController release]; viewController = nil; 
    ... 
} 

et dans votre l » deallocviewController vous devrez libérer la vue gérée, si vous avez alloué manuellement (ou partout où il il est logique que votre contrôleur libère sa vue, si nécessaire). Par contre, à chaque fois que votre superview est désalloué, l'affichage que vous avez ajouté en tant que sous-vue sera également publié (conformément à la spécification Apple du comportement addSubview). Donc, rien à craindre ici. Relâchez juste le viewController (et faites en sorte que le contrôleur de vue gère correctement sa propre vue).

Encore une note: vous ne devez pas libérer votre contrôleur de vue dans viewDidUnload.

Questions connexes