2010-08-10 5 views
1

Je suis débutant avec Cocoa Touch, j'ai un problème que je tente de comprendre. J'apprécierai si quelqu'un pourrait aider.Tableau est vide après la fonction

Je voudrais créer une tableDataList à afficher sur la table. AsyncViewController appelle la méthode TableHandler fillList pour initialiser les données de la table. Mais après l'appel fillList, la tableDataList retourne vide.

Quelqu'un peut-il m'expliquer ce problème?

Dans "AsyncViewController.m":

// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [self.myHandler fillList]; 
    [super viewDidLoad]; 
} 

Dans "TableHandler.m":

@implementation TableHandler 

#define ItemNumber 20 

@synthesize tableDataList; 

- (void) fillList { 
    NSMutableArray *array = [NSMutableArray arrayWithCapacity:(NSUInteger) 20]; 

    for (NSUInteger i = 0; i < ItemNumber; i++) { 
     [array addObject:[NSString stringWithFormat:@"Row %d", i]]; 
    } 

    tableDataList = [NSArray arrayWithArray:array]; 
} 

Merci

+0

Bonjour Stephen, comment puis-je formater ma question comme vous l'avez fait pour moi? Merci – haisergeant

+0

Je pense que vous pouvez frapper 'edit' pour voir comment il l'a formaté. – Kalle

+0

Sinon, il y a un orange vif "?" boîte à côté du champ d'édition sur lequel vous pouvez cliquer pour obtenir toutes sortes d'informations utiles. Il va ici: http://stackoverflow.com/editing-help – Kalle

Répondre

1

tableDataList doit conserver le nouveau tableau, ou il sera auto-libéré peu après votre appel.

Si tableDataList est un @property avec retain, il suffit de changer la ligne ci-dessus pour:

self.tableDataList = [NSArray arrayWithArray:array]; 

et le poseur se chargera pour vous.

L'équivalent d'un @property (retain) NSArray *tableDataList; est dans le code,

- (void)setTableDataList:(NSArray *)anArray 
{ 
    if (tableDataList != nil) { 
     [tableDataList autorelease]; 
    } 
    tableDataList = [anArray retain]; 
} 

Le code ci-dessus libérera automatiquement et conserver les objets lorsque vous remplacez la variable, en utilisant self.tableDataList = SOMETHING. Cependant, si vous utilisez simplement tableDataList = SOMETHING vous n'utilisez pas le setter ci-dessus, vous définissez la variable directement.

+0

Oh, ça marche. Pourriez-vous m'expliquer la différence entre tableDataList et self.tableDataList? Désolé pour cette question stupide. Mille mercis – haisergeant

+0

La différence est que lorsque vous utilisez "self.variable" vous appelez le setter pour la variable. Le setter est une méthode pratique que vous avez configurée avec @property et @synthesize. Puisque vous l'avez défini sur @property (conserver) dans votre fichier d'en-tête, le système fera quelque chose comme ... (voir la réponse ci-dessus, je l'ai mis à jour). – Kalle

0

Etes-vous sûr il est vide et non nul? Vous devrez peut-être affecter la tableDataList avant de l'utiliser

+0

J'ajoute [tableDataList count] à la fenêtre Expressions et je reçois "hors de portée", après que le programme a reçu le signal: "EXC_BAD_ACCESS" Je pense que le NSMutableArray * Le tableau est vide quand il sort de sa fonction. Ainsi, la tableDataList est vide. Est-ce correct? – haisergeant

+0

Il ne serait pas nul, il pointerait vers un emplacement poubelle dans la mémoire, où le tableau libéré était. – Kalle