我开始了一个非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
方法发布它?
答案 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"];