2009-08-25 8 views
0

J'ai du mal à travailler avec les tableaux. Venant de AS2/AS3 et garbage collection est nouveau pour moi ...;)Erreur lors de la conservation de la matrice NS (Mutable) dans une classe

Ce n'est pas le code complet, juste les parties qui comptent.

.h-file 
@interface HelperViewController : UIViewController { 
    NSMutableArray *pagesNumbers; 
} 
@property (nonatomic, retain) NSMutableArray *pagesNumbers; 

.m-file 
@synthesize pagesNumbers; 
-(void)loadView { 
    pagesNumbers = [NSMutableArray arrayWithObjects:[NSNumber numberWithInt:1], [NSNumber numberWithInt:1], [NSNumber numberWithInt:1], [NSNumber numberWithInt:1], nil]; 
    NSLog(@"pagesNumbers: %@", pagesNumbers); // WORKS! 
} 
-(void)changePage:(id)sender { 
    NSLog(@"pagesNumbers: %@", pagesNumbers); // PROBLEM* 
} 

Le problème * là est que cela fonctionne lorsque la fonction est appelée par viewDidLoad, mais ne CRASH quand il est appelé par un UIButton plus tard avec ce (très instructif) msg:

[ Début de la session le 2009-08-25 11:12:51 +0200.] GNU gdb 6.3.50-20050815 (version Apple gdb-966) (mar 10 mars 02:43:13 UTC 2009) Copyright 2004 Free Software Foundation , GDB est un logiciel libre, couvert par la GNU General Public License, et vous êtes le bienvenue pour le changer et/ou distribuer des copies de celui-ci sous certaines conditions. Tapez "show copy" pour voir les conditions. Il n'y a absolument aucune garantie pour GDB. Tapez "show warranty" pour plus de détails. Cette GDB a été configuré comme "i386-apple-darwin" .sharedlibrary appliquent-charge des règles tout Fixation pour traiter 13197.

peut-elle aider quelqu'un, s'il vous plaît?

Cordialement, Eric.

Répondre

2

On dirait que pagesNumbers n'est pas conservé.

Essayez d'ajouter:

[pagesNumbers retain]; 

après le tableau a été initialisé en loadview. Je crois que arrayWithObjects retournera un tableau autoreleased, donc vous devez le conserver explicitement si vous voulez l'utiliser plus tard.

Modifier, vient de remarquer pagesNumbers est également une propriété. Vous initialisez directement PagesNumbers pour que le setter synthétisé ne soit pas appelé (et ne soit pas automatiquement conservé). Si vous voulez utiliser le setter de la propriété, je crois que vous devez référencer pagesNumbers en utilisant self, par exemple

self.pagesNumbers = [NSMutableArray arrayWithObjects..... 
+0

Merci beaucoup, Tom, le "self" a fait l'affaire. Et avec votre explication, il est finalement définitivement brûlé dans mon cerveau pour utiliser le «moi». Passez une bonne journée, la mienne est grâce à vous maintenant! ;) –