0

.m ファイルで mineHit メソッドを呼び出すと、EXC BAD ACCESS エラーが発生する理由がわかりません。ボタン配列が解放されたことを示していることは理解していますが、なぜ解放されたのかはまったくわかりません。

#import "basicsViewController.h"

@implementation basicsViewController
@synthesize resetGame;
@synthesize scoreLabel;
@synthesize timeLabel;
@synthesize time;
@synthesize score;

-(void)newGame{
int index=0;
int yAxis=70;
for(int y=0;y<100;y=y+10){
    int xAxis=20;
    for( int x = 1; x < 11; x++) {
        buttonArray[index] = [[UIButton alloc]init];
        buttonArray[index] = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [buttonArray[index] setTag:index];
        [buttonArray[index] addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
        buttonArray[index].frame = CGRectMake(xAxis, yAxis, 26.0, 26.0);
        NSLog(@"tag:%d xAxis:%d yAxis:%d",buttonArray[index].tag,(int)buttonArray[index].frame.origin.x,(int)buttonArray[index].frame.origin.y);
        [self.view addSubview:buttonArray[index]];
        xAxis=xAxis+28;
        index=x+y;
    }
    yAxis=yAxis+28;
}

//generate bombs

for (int bombs=0;bombs<10;bombs++){

    bombArray[bombs]= (arc4random()%99);
    //TODO compare against bombArray to make sure of no duplicates
    NSLog(@"BOMB AT %d",bombArray[bombs]);

}

}



- (IBAction)resetPress:(id)sender {
[self newGame];
}


- (void)buttonClicked:(UIButton*)button
{
BOOL hit;
NSLog(@"SELECTED BUTTON:%d",button.tag);
for (int b=0;b<10;b++){
    if (button.tag==bombArray[b]){
        //BOMB HIT
        hit=YES;
        b=10;
    }
    else {
        //no bomb
        hit=NO;
    }
}
if (hit==YES){
    //if hit
    NSLog(@"HIT AT %d",button.tag);
    [self mineHit];

}
else {
    //if not hit
    NSLog(@"%d is clean",button.tag);
    [self cleanHit:button];

}
}

-(void)mineHit{

for (int d=0;d<100;d++){
    NSLog(@"%i",buttonArray[d].tag);
    buttonArray[d].enabled=NO;
    [buttonArray[d] setTitle:@"*" forState:UIControlStateDisabled];
}

}
-(void)cleanHit:(UIButton*)button{
button.enabled=NO;
[button setTitle:@"!" forState:UIControlStateDisabled];

}

- (void)viewDidLoad
{
[super viewDidLoad];
[self newGame];

}

- (void)viewDidUnload
{
[self setResetGame:nil];
[self setScoreLabel:nil];
[self setTimeLabel:nil];
[super viewDidUnload];

}
@end

ここに私の.hファイルがあります

#import <UIKit/UIKit.h>
NSInteger bombArray[];
UIButton *buttonArray[];
@interface basicsViewController : UIViewController
@property (weak, nonatomic) IBOutlet UIButton *resetGame;
@property (weak, nonatomic) IBOutlet UILabel *scoreLabel;
@property (weak, nonatomic) IBOutlet UILabel *timeLabel;
@property int time;
@property int score;
-(void)newGame;
-(void)buttonClicked:(UIButton*)button;
-(void)mineHit;
-(void)cleanHit:(UIButton*)button;

@end
4

1 に答える 1

1

コードをコンパイルすると、4 つの警告が表示されます。4 つの警告はすべて同じで、次のように表示されます。

要素が 1 つと仮定された仮の配列定義

警告は、インターフェイス (.h) ファイル内の配列bombArrayと配列の定義に適用されます。buttonArray

2 つの配列にサイズを指定すると、-mineHitメソッドは正常に機能します。

.h ファイルの先頭を次のように変更します。

#import <UIKit/UIKit.h>
NSInteger bombArray[10];
UIButton *buttonArray[100];
@interface basicsViewController : UIViewController

コンパイラは何らかの理由で警告を生成します。コードを警告やエラーなしで正常にコンパイルすることをお勧めします。

更新: ここにいる間、これらの配列をインターフェイス内に移動してインスタンス変数として宣言できない理由はありません。これを行うことは、配列がView Controllerの個々のインスタンスに関連付けられることを意味します。このView Controllerのインスタンスが複数ある可能性は低いですが、後で噛まれるよりも、今すぐ正しく実行することをお勧めします.

#import <UIKit/UIKit.h>

@interface basicsViewController : UIViewController {
    NSInteger bombArray[10];
    UIButton *buttonArray[100];
}

興味深いことに、宣言をインターフェイスに移動すると、警告がエラーに変わります。

于 2012-04-10T03:39:39.653 に答える