尝试访问performselector中的私有CCLabelBMFont成员时的EXC_BAD_ACCESS

时间:2013-04-21 16:35:57

标签: objective-c cocos2d-iphone exc-bad-access performselector

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

尝试访问EXC_BAD_ACCESS内的私人CCLabelBMFont成员时,会引发错误performSelector:withObject:afterDelay: title正在doSomeInit方法中进行分配。但不知怎的,我无法用doSomething方法访问它 如何接触孩子呢? 我在下面举了一个简单的例子:

A.H

@interface IntroLayer : CCLayer {

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

也尝试过这个......没有运气。 的 A.H

@interface IntroLayer : CCLayer {
   CCLabelBMFont *_title;
}

<小时/> 的 A.M

@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:保留方法是否泄漏任何记忆?
也许我应该用重叠-(void)onExit方法发布它?

1 个答案:

答案 0 :(得分: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"];