0

我开始了一个非 ARC cocos2d 项目。

EXC_BAD_ACCESS尝试访问方法中分配的私有CCLabelBMFont成员时会引发错误。但不知何故,我无法在方法中访问它。 我应该怎么做才能访问它的孩子? 我在下面举了一个简单的例子:performSelector:withObject:afterDelay:
titledoSomeInitdoSomething

@interface IntroLayer : CCLayer {

}
@property (nonatomic,strong) CCLabelBMFont *_title;
@end

也试过这个......没有运气。

@interface IntroLayer : CCLayer {
   CCLabelBMFont *_title;
}


@implementation IntroLayer
@synthesize _title;
 .
 .
- (void)doSomeInit {
    _title = [CCLabelBMFont labelWithString:@"Test Label" fntFile:"blah.fnt"];
    [self performSelector:@selector(doSomething) withObject:nil afterDelay:5];
}

- (void)doSomething {
    int count = 0;
    for (CCSprite* la in _title.children) { //<<<<<EXC_BAD_ACCESS ERROR THROWS HERE!!!
        la.opacity = 0;
    }
    [self addChild: _title];
}


下一个相关问题是:
我修改了
_title = [CCLabelBMFont labelWithString:@"Test Label" fntFile:"blah.fnt"];

_title=[CCLabelBMFont labelWithString:@"Test Label" fntFile:"blah.fnt"];  
[_title retain]; //this fixes EXC_BAD_ACCESS error. 

但是:
问题 2:retain 方法是否泄漏了任何内存?
也许我应该以覆盖的方法释放它-(void)onExit

4

1 回答 1

3

在您的方法doSomeInit中,您的语句直接_title = [CCLabelBMFont labelWithString:@"Test Label" fntFile:"blah.fnt"];分配一个自动释放CCLabelBMFont对象_title,即不使用 setter 方法。因此,该对象不会被保留,并会在应用程序返回主运行循环时立即释放。所以当doSomething执行时,这个对象被释放,你会得到 EXC_BAD_ACCESS 错误。
您应该使用 setter 方法self._title = [CCLabelBMFont labelWithString:@"Test Label" fntFile:"blah.fnt"];

于 2013-04-21T19:53:19.187 回答