2013-07-18 136 views
0

我包括完整的项目,所以没有什么不明确的。iOS应用程序崩溃与EXC_BAD_ACCESS

A.H

#import <Foundation/Foundation.h> 

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

A.M

#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时,程序在函数零中崩溃。我还想指出,如果从ViewController的实现中删除

[[A alloc] init]; 

程序不会崩溃。感谢任何帮助,提前。

+0

'_gameBoard = [[A alloc] init]; [[A alloc] init];'这很奇怪alloc-init两次 –

回答

1

你的代码有几个问题。首先,创建另一个A实例并将其分配给一个变量没有意义。

的主要问题是,虽然你不使用实例变量(或属性)既不在你的ViewController_gameBoard)也没有对Auint8_t** _board)。

使他们的实例变量(或属性)应该解决您的问题。

PS:您可能还想使用NSArray而不是C风格的数组。

+0

谢谢,问题是我不知道在我导致它静态的地方放置_board。我认为这一直是一个实例变量。猜猜我只是不知道语法。无论如何,非常感谢,这个问题对我来说是地狱。 – tomKPZ

2

board设为A级的伊娃,你的问题应该消失。现在它是一个全局的,第二个[[A alloc] init];free它(看起来你已经启用了ARC,并且llvm会看到该对象没有被实际使用并且立即释放它)。

当你调用

[_gameBoard zero];

现在正试图引用free倒是全球board,它抛出一个EXC_BAD_ACCESS例外。

board这样的全局变量通常是一个坏主意,正如你发现的那样。

+0

看起来像马塞洛法布里击败你。你是对的,我需要创建实例变量。谢谢您的帮助。 – tomKPZ

+0

无论如何,只要你弄明白了,理解它为什么不起作用。 – gschandler

相关问题