簡體   English   中英

iOS應用因EXC_BAD_ACCESS崩潰

[英]iOS app crashes with EXC_BAD_ACCESS

我包括整個項目,所以沒有任何歧義。

#import <Foundation/Foundation.h>

@interface A : NSObject
-(void) zero;
@end

上午

#import "A.h"

@implementation A

#define width 3
#define height 3

uint8_t** _board;

-(void) zero
{
for(int i = 0; i < width; i++)
    for(int j = 0; j < height; j++)
        _board[i][j] = 0;
}

-(void)dealloc
{
for(int i = 0; i < width; i++)
    free(_board[i]);
free(_board);
}

-(id) init
{
self = [super init];
if(self)
{
    _board = malloc(sizeof(uint8_t*)*width);
    for(int i = 0; i < width; i++)
        _board[i] = malloc(sizeof(uint8_t)*height);
}
return self;
}

@end

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
@end

ViewController.m

#import "ViewController.h"
#import "A.h"

@implementation ViewController

A* _gameBoard;

- (void)viewDidLoad
{
[super viewDidLoad];

_gameBoard = [[A alloc] init];
[[A alloc] init];

[_gameBoard zero];
}

@end

具體來說,設置_board時,程序會在功能零中崩潰。 我還要指出,如果您刪除

[[A alloc] init];

從ViewController的實現中,程序不會崩潰。 預先感謝您的幫助。

board設為A類的ivar,您的問題就應該解決了。 現在,它是全局的,第二個[[A alloc] init]; 正在free它(似乎您已啟用ARC,並且llvm會看到該對象實際上並未被使用並立即釋放它)。

調用時

[_gameBoard zero];

現在它正在嘗試引用free 'd全局board ,該board拋出EXC_BAD_ACCESS異常。

正如您所發現的那樣,像board這樣的全球人士通常不是一個好主意。

您的代碼中有幾個問題。 首先,創建另一個A實例並將其分配給變量沒有任何意義。

但是主要的問題是您既不在ViewController_gameBoard )上也沒有在Auint8_t** _board )上使用實例變量(或屬性)。

使它們成為實例變量(或屬性)應該可以解決您的問題。

PS:您可能還想使用NSArray而不是C樣式的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM