0

虽然有 OOP 经验,但我绝对是 Objective-C 的新手。我有以下代码:

// header files have been imported before this statement...
CCSprite *treeObstacle;
NSMutableArray *treeObstacles;

@implementation HelloWorldLayer {
}

-(id) init
{
    // create and initialize our seeker sprite, and add it to this layer
    treeObstacles = [NSMutableArray arrayWithObjects: nil];        
    for (int i=0; i<5; i++) {
        treeObstacle = [CCSprite spriteWithFile: @"Icon.png"];
        treeObstacle.position = ccp( 450-i*20, 100+i*20 );
        [self addChild:treeObstacle];
        [treeObstacles addObject: treeObstacle];
    }
    NSLog (@"Number of elements in array = %i", [treeObstacles count]);
    return self;
}

- (void) mymethod:(int)i {
    NSLog (@"Number of elements in array = %i", [treeObstacles count]);
}

@end

第一个 NSLog() 语句返回“数组中的元素数 = 5”。问题是(虽然 treeObstacles 是一个文件范围的变量)当调用方法“mymethod”时,我会得到一个 EXC_BAD_ACCESS 异常。

有人可以帮我吗?

非常感谢基督徒

4

1 回答 1

4

你创建treeObstacles

treeObstacles = [NSMutableArray arrayWithObjects: nil];

这将返回一个自动释放的对象,并且您没有保留它,因此它将很快被释放

你必须通过调用它来保留retain

[treeObstacles retain];

简单的创建它

treeObstacles = [[NSMutableArray alloc] init];

你需要记住在完成后释放它

- (void)dealloc {
    [treeObstacles release];
    [super dealloc];
}

您需要阅读有关 Objective-C 管理的更多信息 https://developer.apple.com/library/mac/#documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html

或使用 ARC,因此无需再担心保留/释放 http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html


另一个问题,你需要调用[super init]你的init方法

- (id)init {
    self = [super init];
    if (self) {
        // your initialize code
    }
}

否则您的对象将无法正确初始化

于 2012-04-22T08:36:37.107 回答