Cocos2d: CCSprite initWithFile in CCSprite subclass crashes(Cocos2d:CCSprite 子类中的 CCSprite initWithFile 崩溃)
问题描述
我有自定义 CCSprite 子类的 cocos2d 项目:
I have cocos2d project with custom CCSprite subclass:
MyCustomSprite.h:
MyCustomSprite.h:
#import "cocos2d.h"
@interface MyCustomSprite : CCSprite
@end
MyCustomSprite.m:
MyCustomSprite.m:
#import "MyCustomSprite.h"
@implementation MyCustomSprite
- (id)init
{
self = [super initWithFile:@"index.png"];
return self;
}
@end
由于某些奇怪的原因,这段代码会因EXC_BAD_ACCESS"而崩溃.
For some strange reason, this code will crash with "EXC_BAD_ACCESS".
但尽管如此,如果我像往常一样初始化超级,然后从 CCSprite 的 initWithFile 和 initWithTexture 编写代码,它会正常工作:
But in spite of this, if i init super as ususal and then write code from CCSprite's initWithFile and initWithTexture, it will work fine:
self = [super init];
if (self) {
// Code from CCSprite.m - initWithFile
CCTexture2D *texture = [[CCTextureCache sharedTextureCache] addImage: @"index.png"];
CGRect rect = CGRectZero;
rect.size = texture.contentSize;
// Code from CCSprite.m - iniWithTexture
[self setTexture:texture];
[self setTextureRect:rect];
return self;
}
第一个示例崩溃的原因是什么,第二个没有,它们之间有什么区别?
What's the reason that the first example crashes, and second not and what's the difference between them?
感谢您的回答!
推荐答案
好吧,原因是 CCSprite 设计不好.如果我们查看 CCSprite.h,我们可以发现:
Ok, the reason is bad CCSprite design. If we look to CCSprite.h, we can find:
-(id) initWithTexture:(CCTexture2D*)texture rect:(CGRect)rect
{
NSAssert(texture!=nil, @"Invalid texture for sprite");
// IMPORTANT: [self init] and not [super init];
if( (self = [self init]) )
}
这就是原因.此方法调用 [self init]
代替 [super init]
,并创建递归 ([self init]-[super InitWithFile:]-[self initWithTexture]-[self init]-...)
.
And thats the reason. Instead of [super init]
this method calls [self init]
, and creates recursion ([self init]-[super InitWithFile:]-[self initWithTexture]-[self init]-...)
.
.
因此,解决此问题的最简单方法 - 只需将您的 init 方法重命名为其他名称(例如initialize")并调用它而不是 init:[[MyCustomSpritealloc] 初始化]
.
So, the simplest way to solve this problem - just re-name your init method to something else (for example "initialize") and call it instead of init: [[MyCustomSprite
alloc] initialize]
.
这篇关于Cocos2d:CCSprite 子类中的 CCSprite initWithFile 崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:Cocos2d:CCSprite 子类中的 CCSprite initWithFile 崩溃
基础教程推荐
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01