2012-04-10 15 views
0

Derzeit wird versucht, ein Array zu speichern, das entsprechend den Zellen in einem UITableView-Objekt ausgefüllt ist, und dieses Array in einer Instanz eines separaten Objekts zu speichern. Ich bekomme das Array zu füllen, aber meine Speichermethode, die eine IBAction ist, die durch Klicken auf eine Schaltfläche aufgerufen wird, scheint nicht zu funktionieren. Hier ist ein Code:Speichern von Arrays zwischen Klassen

-(IBAction)saveWorkout:(id)sender { 
    Workouts *new = [[Workouts alloc] init]; 
    [new addNewWorkout:customWorkout]; 

    [customWorkout removeAllObjects]; 
} 

Dieser Code stammt aus der ersten Klasse.

Und hier ist der Code für meine addNewWorkouts Methode in der Klasse Traininge:

-(void)addNewWorkout:(NSMutableArray*)array { 
    NSMutableArray *temp = [[NSMutableArray alloc] init]; 
    temp = array; 

    self.workoutList = temp; 

    [temp release]; 

} 

Hier ist meine "Workout.h"

#import <Foundation/Foundation.h> 


@interface Workouts : NSObject { 
    NSString *workoutName; 
    NSMutableArray *workoutList; 
    NSString *description; 
    int *reps; 
    int *weights; 
    int *sets; 
} 
@property (nonatomic, retain) NSString *workoutName; 
@property (nonatomic, retain) NSString *description; 
@property (nonatomic, retain) NSMutableArray *workoutList; 

-(void)addNewWorkout:(NSMutableArray*)array; 

@end

Vor dem Ausführen dieses Codes Ich erhalte eine Warnung von Xcode, dass 'Workouts möglicherweise nicht auf' addNewWorkouts 'reagieren.

Wer weiß, was diesen Fehler verursacht? Sobald ich & run gebaut habe, klicke ich auf die Schaltfläche Speichern und die App stürzt mit einem unbekannten Selektor ab, der an Instanz 0x3b04410 Fehler gesendet wird.

+0

Dies hängt nicht mit Ihrem Problem zusammen, aber sobald Sie diesen Fehler behoben haben, funktioniert Ihr Code immer noch nicht richtig. Ich würde vorschlagen, die Speicherverwaltungsregeln zu überprüfen: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html#//apple_ref/doc/uid/10000011-SW1 (Hinweis: Das '[[NSMutableArray alloc] init]' an der Spitze ist ein Leck, die '[temp release]' am unteren Rand ist eine Overrelease, und 'self.workoutList = temp' kann oder kann nicht richtig funktionieren, abhängig von Wie der Setter für die "workoutList" -Eigenschaft implementiert wird – Chuck

Antwort

2

Sie rufen [new addNewWorkouts:customWorkout] , wenn die Wahl Methode ist addNewWorkout: (beachten Sie, dass es keinen Plural im Namen Methode ist)

Dies wird einen schlechte Methode Anruf und zu einem Absturz führen.

Außerdem gibt es ein Problem mit der Speicherverwaltung der Methode addNewWorkout.

1- NSMutableArray *temp = [[NSMutableArray alloc] init]; 
2- temp = array; 
3- self.workoutList = temp; 
4- [temp release]; 

Sie ordnen eine neue NSMutableArray auf der Linie 1, dann auf seine Referenz verlieren Linie 2, wenn Sie seinen Zeiger von ‚Array‘ ersetzen. Die Zuweisung, die Sie gerade vorgenommen haben, ist verloren und das Programm wird undicht.

Dann senden Sie in Zeile 4 eine Freigabenachricht an 'temp', die tatsächlich auf 'array' zeigt, was zur Freigabe des Parameters führt, den Sie erhalten haben, und nicht des temporären Objekts.

Gibt es einen Grund, warum Sie ein temporäres Array erstellen? Sie können die Eigenschaft einfach zuweisen und die Eigenschaft je nach Bedarf kopieren oder beibehalten.

+0

Der Code wird immer noch nicht richtig funktionieren, weil die Speicherverwaltung falsch ist, aber das wird tatsächlich den spezifischen Fehler beheben. – Chuck

+0

Hinweise zur Speicherverwaltung? – TopChef

+0

Konsole zeigt auch diesen Fehler: unerkannter Selektor an Instanz 0x3b04410 gesendet – TopChef

Verwandte Themen