2010-10-09 6 views
0

Im assez nouveau dans le monde entier de l'iPhone dev alors pardonnez-moi si cela est très facile. J'ai un objet Card qui contient 6 Question objets à ce sujet. quand je dis [card getQuestion:@"Art"] je retourne actuellement un objet Question comme siRetour objet plantage iPhone

- (Question*) getQuestion: (NSString*) questionType { 
    Question *q = [questions objectForKey:questionType]; 
    return [q autorelease]; 
} 

Question a une propriété de text (type NSString) qui me permet de voir ce que le texte de la question. Donc, je veux utiliser ce texte pour mettre à jour un UILabel dans le viewController

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    NSLog(@"%@", [[self.card getQuestion:@"Art"] qText]); 
    self.myQuestion.text = [[self.card getQuestion:@"Art"] qText]; 
} 

Cette plante l'iPhone, alors que si je change la fonction dans l'objet Card à cette

- (NSString*) getQuestion: (NSString*) questionType { 
    return [[questions objectForKey:questionType] qText]; 
} 

et mon appel dans le viewController à

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    NSLog(@"%@", [self.card getQuestion:@"Art"]); 
    self.myQuestion.text = [self.card getQuestion:@"Art"]; 
} 

Cela fonctionne très bien .. quelqu'un peut-il expliquer ce que je fais mal, dans les deux cas, l'appel à NSLog me renvoie le texte pertinent. Dans les deux cas, l'affichage se charge mais dans un premier temps il se bloque peu de temps après, alors que dans l'autre il reste stable.

Toute aide appréciée.

+0

si quelqu'un répond à votre question, vous devez l'accepter. – bbum

+1

** Correction: ** Si quelqu'un répond à votre question ** avec une solution qui vous a aidé **, vous devez l'accepter _en cliquant sur le ✔ à côté de la réponse, qui va accorder à l'auteur._ – Emil

+0

@Emil une réponse correcte est pas toujours une réponse utile. –

Répondre

0

Depuis que vous êtes nouveau à tout cela - vous devez absolument vous assurer que vous exécutez votre application à la recherche de zombies et aussi l'exécuter avec l'application d'instruments pour s'assurer que vous ne fuyez nulle part.

Vous devriez lire une très courte explication de la gestion de la mémoire dans Objective-C tous les quelques jours - un jour, tout va sombrer et devenir une seconde nature.

http://macdevelopertips.com/objective-c/objective-c-memory-management.html

+0

Ouais j'ai lu et compris les bases de la gestion de la mémoire de l'Obj C, juste un cas de mise en pratique, c'est la seule façon que je vais apprendre en me trompant. Merci pour le lien, je l'ai bookmarké et je le lirai plusieurs fois :) – Catharsis

5
- (Question*) getQuestion: (NSString*) questionType { 
    Question *q = [questions objectForKey:questionType]; 
    return [q autorelease]; 
} 

Selon les règles de gestion de la mémoire, vous devez pas être autoreleasing cet objet, et cela est presque certainement la cause de votre accident. Vous renoncez à la propriété d'un objet que vous ne possédez pas, ce qui le libère prématurément. Cela signifie que lorsqu'un autre objet est supposé posséder la Question essaie d'y accéder, la Question a disparu et vous plantez avec une erreur EXC_BAD_ACCESS. En outre, le procédé devrait probablement être appelé questionForType: ou questionOfType:. L'utilisation du préfixe get implique que l'objet sera renvoyé via un paramètre externe, ce qui n'est pas le cas.

+0

Ça craquait, merci beaucoup, j'ai pris ce truc autorelease d'un autre exemple que j'ai trouvé quelque part, mais je pense que ce n'était pas une application iPhone. Oh et merci pour l'indice de fonction, en essayant d'utiliser les conventions de nommage – Catharsis

0

Je vois deux erreurs,

1: Vous publiez quelque chose que vous ne possédez pas (question « q ») - Si vous faites soit alloc, copier ou conserver, vous devez libérer. Sinon, vous ne devriez pas.

2: La ligne setter devrait être écrit comme ceci:

Question *q = (Question *)[questions objectForKey:questionType]; 

De cette façon, vous éviter d'avoir des avertissements ou des erreurs.

+0

1 est correct, 2 est inutile. 'objectForKey:' retourne un objet de type 'id', qui peut être assigné en toute sécurité à n'importe quelle variable d'objet sans conversion. –

+0

J'ai parfois rencontré des problèmes lorsque je ne castais pas un objet (par exemple un délégué). – Emil