2009-10-05 7 views
0

Je me suis cassé la tête sur un problème qui n'a pas vraiment de sens. Dire que je donne les résultats suivants dans mon projet:Accéder aux propriétés de l'objet à partir du délégué

AppDelegate MyClassA MyClassB MyViewController

En MyClassA, il y a une propriété de type MyClassB par le nom ClassB. MyClassB a une propriété de type NSMutableArray par le nom de pointeur myArray.

Lorsque la MyViewController sous viewDidLoad I instancier MyClassA pour accéder au monTableau dans sa propriété (de MyClassA) MyClassB, comme suit:

MyClassA *classA = [[MyClassA alloc] init]; 
NSLog([NSString stringWithFormat:@"%i", [[[classA classB] myArray] count]); 

Il affichera le décompte sur le journal avec succès et en même temps, un accès ultérieur au contenu de la matrice fonctionne bien.

Cependant, toujours dans le MyViewController, lorsque le MyClassA est instancié et accessible à partir du délégué comme suit:

AppDelegate *aDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
NSLog([NSString stringWithFormat:@"%i", [[[aDelegate classA] classB] myArray] count]]); 

le journal affiche toujours le nombre avec succès, mais un accès plus au contenu du tableau échoue ne montrant aucune erreur mais une "langue actuelle: auto actuellement objectif-c" - juste une ligne de celui-ci.

Ceci est un comportement étrange que je ne peux pas comprendre. Y at-il une différence entre accéder aux objets instanciés dans le délégué et accéder localement aux objets dans une fonction (dans viewDidLoad de ViewController comme dans l'exemple) ou quelque chose?

aide est très appréciée = D

Répondre

1

Il semble que votre application se bloque en raison de l'accès à la mémoire déjà libérée. Si vous souhaitez examiner cela plus en détail, je vous recommande de définir la variable d'environnement NSZombieEnabled sur YES (dans les paramètres exécutables de XCode).

Dans ce cas spécifique, il serait bon de savoir exactement comment la variable membre classA du délégué est initialisée et comment elle est accédée. Peut-être que n'importe quelle variable (que ce soit classA, classB ou myArray) est auto-libérée (ou créée en utilisant une méthode de commodité) et non conservée. Vous auriez alors accès à cette variable membre jusqu'à ce que le pool autorelease soit drainé pour la prochaine fois.

+0

Assurez-vous que la configuration active est définie sur Déboguer afin que vous puissiez mieux examiner le point d'arrêt. – Jordan

Questions connexes