iOS应用程序与EXC_BAD_ACCESS崩溃

时间:2013-07-18 05:09:21

标签: ios objective-c memory-management

我包括整个项目,所以没有什么是模糊的。

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时程序在函数0中崩溃。我还想指出,如果你删除

[[A alloc] init];
从ViewController的实现

,该程序不会崩溃。提前感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

board成为A级的ivar,你的问题应该消失。现在它是全局的,第二个[[A alloc] init];free它(看起来你启用了ARC,并且llvm将看到该对象实际上没有被使用并立即释放它。)< / p>

当您调用

[_gameBoard zero];

现在它正在尝试引用free全局board,这会引发EXC_BAD_ACCESS异常。

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

答案 1 :(得分:1)

您的代码中存在多个问题。首先,创建另一个A实例并且不将其分配给变量是没有意义的。

但主要问题是您在ViewController_gameBoard)和Auint8_t** _board)上都没有使用实例变量(或属性)。

使它们成为实例变量(或属性)应该可以解决您的问题。

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