2 Stimmen

Gemeinsame Nutzung von NSArray-Inhalten durch mehrere Methoden in einer einzigen Klasse

Was mache ich falsch? Mein Code stürzt ab, wenn ich versuche, das Array zu protokollieren. Hier ist meine Klasse:

@interface ArrayTestAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    NSArray *array;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) NSArray *array;

-(IBAction)buttonPressed;

@end

@implementation ArrayTestAppDelegate

@synthesize window, array;

- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    array = [NSArray arrayWithObjects:@"Banana", @"Apple", @"Orange", @"Pear", @"Plum", nil];

    [window makeKeyAndVisible];
}

-(IBAction)buttonPressed {

    NSLog(@"%@", array);

}

- (void)dealloc {
    [window release];
    [array release];
    [super dealloc];
}

@end

5voto

zoul Punkte 99332

Dies ist ein häufiger Speicherverwaltungsfehler in Cocoa. Die arrayWithObjects Methode der NSArray Klasse gibt ein automatisch freigegebenes Objekt zurück. Zu dem Zeitpunkt, zu dem Sie versuchen, das Array in der buttonPressed Methode wurde das Array bereits freigegeben und es kommt zu einem Absturz. Die Lösung ist einfach:

array = [[NSArray alloc] initWithObjects:@"Banana", @"Plum", nil];

Oder:

array = [[NSArray arrayWithObjects:@"Banana", @"Plum", nil] retain];

Ich denke, das erste Beispiel ist besser, denn die Beibehaltung am Ende des zweiten Beispiels ist leicht zu übersehen. Ich würde vorschlagen, dass Sie etwas mehr über die Speicherverwaltung in Cocoa lesen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X