2010-09-09 3 views
0

Je viens de sauter dans Objective-C et je suis resté bloqué assez tôt. Je posterai le code avec ma question mais pour le garder lisible je me débarrasserai de la merde, laissez-moi savoir si vous voulez plus de code posté!Impossible d'accéder aux propriétés d'un objet dans l'objectif-c

J'ai créé un nouvel objet appelé 'Phrase' (sous-classé à partir de NSObject), et je lis des éléments de JSON dans ces objets 'Phrase' et les ajoute à un tableau. Voici le premier lot de code:

Exemple JSON:

{ 
    "phrases": [ 
     { 
      "title": "Title of my Phrase", 
     "definition" : "A way to look at some words", 
    "location" : "Irish Proverb" 
     } 
    ] 
    } 

Script Je le lis avec:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

self.phraseDictionary = [[NSMutableArray alloc] initWithObjects:nil]; 

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"phrase" ofType:@"json"]; 
NSString *myRawJSON = [[NSString alloc] initWithContentsOfFile:filePath]; 

NSData *jsonData = [myRawJSON dataUsingEncoding:NSUTF32BigEndianStringEncoding]; 
NSDictionary *entries = [[CJSONDeserializer deserializer] deserializeAsDictionary:jsonData error:nil]; 


for (id key in entries) { 

    NSObject *phrases = [entries objectForKey:key]; 

    for (id phrase in phrases) { 

    Phrase *pushArrayToPhrase = [[Phrase alloc] initWithText:[phrase objectForKey:@"title"] definition:[phrase objectForKey:@"definition"] location:[phrase objectForKey:@"location"]]; 
    [self.phraseDictionary addObject:pushArrayToPhrase]; 

    } 

    } 
    } 

fichier Phrase m:

#import "Phrase.h" 


@implementation Phrase 

@synthesize title; 
@synthesize definition; 
@synthesize location; 

- (id)init { 
self = [super init]; 
if (self != nil) { 
    title = @""; 
    definition = @""; 
    location = @""; 
} 
return self; 
} 

- (id)initWithTitle:(NSString *)tit definition:(NSString *)def location:(NSString *)loc { 
self = [super init]; 
if (self != nil) { 
    title = tit; 
    definition = def; 
    location = loc; 
} 
return self; 
} 


@end 

De là, je boucle à travers les objets et les ajouter à une liste dans mon SPLITVIEW:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"CellIdentifier"; 

// Dequeue or create a cell of the appropriate type. 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 

    Phrase *cellPhrase = [self.phraseDictionary objectAtIndex:indexPath.row]; 
cell.textLabel.text = cellPhrase.title; 
return cell; 
} 

Mais lorsque je clique sur un élément, et demande une phrase sur la base indexPath.row de celui cliqué, je ne peut jamais accéder à la propriété utilisée dans le fichier cell.textLabel.text. Toute tentative d'accès à une propriété à partir de l'objet Phrase à partir de maintenant permet de quitter le simulateur. J'espère que c'est facile à suivre, faites le moi savoir si ce n'est pas le cas et je réessayerai!

+0

Des infos pour lesquelles il existe? Avez-vous vérifié les journaux? –

+0

Comme je viens de le mentionner ci-dessous, j'ai reçu le message "Program received signal:" EXC_BAD_ACCESS "." quand j'ai activé le débogage. J'ai vu ce lien http://stackoverflow.com/questions/327082/exc-bad-access-signal-received mais je ne pouvais pas le relier à ma situation ... –

Répondre

1

Dans la méthode initWithTitle, vous affectez les variables sans les conserver. Si elles ne sont pas conservées n'importe où, elles seront publiées et lorsque vous tenterez d'y accéder, votre application tombera en panne. Si vous n'obtenez aucun message d'erreur, assurez-vous d'activer le débogage.

+0

Qu'entendez-vous par assigner mais ne pas retenir? (Je suis nouveau à ce sujet, donc toujours ma tête assigner/conserver etc) - Où j'ai title = tit; definition = def etc dans la méthode initWithTitle, dois-je faire différemment? –

+0

Aussi - J'ai activé le débogage et je reçois "Signal reçu par programme:" EXC_BAD_ACCESS "." –

+0

Quand vous faites title = tit; rien n'empêche que la mémoire réservée par la chaîne soit libérée plus tard. Donc la prochaine fois que vous essayez d'accéder à la chaîne, votre programme va se bloquer car la mémoire n'est plus valide. Pour éviter cela, essayez title = [Tit conserver]; ou si vos propriétés sont conservées, vous pouvez faire self.title = tit; Ensuite, dans votre méthode dealloc, faites [release title]; pour s'assurer que la mémoire est nettoyée plus tard. – skorulis

Questions connexes