2010-12-30 7 views
2

Ich versuche, ein Array int zu speichern [9] [9] mit einem NSMutableArray von NSMutableArray, wo ich meine speichern 81 ganzen Zahlen aus dem Array:NSMutableArray: Unbekannter Selektor an Instanz gesendet

- (void)awakeFromNib { 
    // initialization matrix 
    for (int i = 0; i < 9; i++) { 
     for (int j = 0; j < 9; j++) { 
      matrix[i][j] = 0; 
     } 
    } 

     // Creating NSMutableArray instance 
    TGrid = [NSMutableArray arrayWithCapacity:10]; 

    [self saveGrid]; 
} 

- (void)saveGrid { 
    NSNumber *aInt; 
    NSMutableArray *Grid = [NSMutableArray arrayWithCapacity:81]; 
    for (int i = 0; i < 9; i++) { 
     for (int j = 0; j < 9; j++) { 
      aInt = [NSNumber numberWithInt:matrix[i][j]]; 
      [Grid addObject:aInt]; 
     } 
    } 
    [TGrid addObject:Grid]; 
} 

- (IBAction)undo:(id)sender { 
    [TGrid removeLastObject]; 
    NSMutableArray *Grid = [TGrid lastObject]; 
    for (int i = 0; i < 9; i++) { 
     for (int j = 0; j < 9; j++) { 
      matrix[8-i][8-j] = [[Grid lastObject] intValue]; 
      [Grid removeLastObject]; 
     } 
    } 
} 

Wenn Save ist zuerst von der watchFromNib-Methode aufgerufen, funktioniert es. Aber wenn ich meine Matrix ändern, ruft es wieder Save, und dieses Mal, wenn ich diesen Fehler:

* Beenden app aufgrund nicht abgefangene Ausnahme 'NSInvalidArgumentException', Grund: ‚- [CALayerArray addObject:] : Unbekannter Selektor 0x4b36ce0'

zum Beispiel schickte ich brauche Ihre Hilfe! Danke!

Antwort

7

Sie müssen TGrid behalten! Andernfalls wird es vom Autorelease-Pool freigegeben und wahrscheinlich nimmt ein CALayer seinen Platz im Speicher ein!

Die beste Option ist, um eine Immobilie zu schaffen, mit retain self.TGrid Vergessen Sie nicht, es am Ende zu lösen aus ihm heraus und Zugriffsattribut (dealloc)

bearbeiten Es freigegeben wird, da jede Instanz Schöpfer Klasse Die Methode stellt eine automatisch freigegebene Instanz bereit (das ist eine Regel, die jeder befolgen sollte und die Apple im gesamten SDK befolgt).

+0

@Bertrand verwenden Sie dies zum Beibehalten TGrid = [[NSMutableArray ArrayWithCapacity: 10] behalten]; – Ishu

+0

Danke, dass es jetzt funktioniert! Warum wurde es freigegeben? – Bertrand

+0

Vielleicht ist 'TGrid = [[NSMutableArray alloc] initWithCapacity: 10]' eine konventionellere Methode zum Erstellen der Instanz. –

Verwandte Themen