2009-08-30 12 views
2

何が間違っていますか?配列を記録しようとすると、コードがクラッシュします。ここに私のクラスはあります:共有NSArray 1つのクラス内の複数のメソッド間の内容

@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 

答えて

5

これはココアの共通のメモリ管理エラーです。 NSArrayクラスのarrayWithObjectsメソッドは、自動解放されたオブジェクトを返します。 buttonPressedメソッドで配列を記録しようとすると、配列はすでに解放されており、クラッシュします。修正は簡単です:

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

または:

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

私は最初のものが優れていると思い、第二の例の端に保つには欠場するのは簡単です。私は、あなたがCocoaのメモリ管理についてもっと読むことをお勧めします。

関連する問題