0

我包括完整的项目,所以没有什么是模棱两可的。

#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

视图控制器.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
@end

视图控制器.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 的实现来看,程序不会崩溃。提前感谢您的帮助。

4

2 回答 2

2

制作boardA 类的 ivar,您的问题应该会消失。现在它是一个全局的,第二个[[A alloc] init];freeing 它(看起来你启用了 ARC,llvm 会看到该对象实际上并没有被使用并立即释放它)。

当你调用

[_gameBoard zero];

它现在正在尝试引用free'd global board,这会引发 EXC_BAD_ACCESS 异常。

board正如您所发现的,像一般这样的全局变量是一个坏主意。

于 2013-07-18T05:21:00.407 回答
1

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

但主要问题是您没有在ViewController( _gameBoard) 和A( ) 上使用实例变量(或属性uint8_t** _board)。

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

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

于 2013-07-18T05:20:35.533 回答