Iphone 目标C中的遗传
我有一个主要的游戏类,它使用OpenGL渲染游戏。现在我想我可以继承这个类,然后在它的init方法中调用Iphone 目标C中的遗传,iphone,objective-c,Iphone,Objective C,我有一个主要的游戏类,它使用OpenGL渲染游戏。现在我想我可以继承这个类,然后在它的init方法中调用[super init]来获取它的副本。计划是对副本进行一些修改,但似乎这不起作用 下面是我的类的头文件: #import "GameView.h" @interface CloneView : GameView { } -(id)initWithFrame:(CGRect)frame; @end 这是克隆视图类: @implementation CloneView -(id)i
[super init]
来获取它的副本。计划是对副本进行一些修改,但似乎这不起作用
下面是我的类的头文件:
#import "GameView.h"
@interface CloneView : GameView {
}
-(id)initWithFrame:(CGRect)frame;
@end
这是克隆视图类:
@implementation CloneView
-(id)initWithFrame:(CGRect)frame{
return [super initWithFrame:frame];
}
@end
如果我在GameView类的init方法中设置了一个断点,它就会停在那里。问题是:我的克隆视图没有渲染,屏幕保持黑色。
我错过了什么?谢谢你的帮助
编辑
记录在案:我在没有实现initFrame
的情况下进行了尝试,得到了相同的结果。(正如预期的那样,上面的initFrame
除了调用super之外没有做任何事情)
编辑2
我正在将我的克隆添加到另一个视图,因此我正在创建两个Eagle上下文。这可能是它不起作用的原因吗?如果您不在
CloneView
的init
函数中添加任何内容,那么您甚至不必重写它。你可以让你的类继承自GameView
,它会自动复制它的init
函数。这是来自苹果的
您应该将self分配给初始值设定项返回的值,因为初始值设定项可能返回与原始接收方返回的对象不同的对象
所以试着这样做
-(id)initWithFrame:(CGRect)frame{
if(self = [super initWithFrame:frame] ) {
//Do whatever you need to do here.
}
return self;
}
如果您需要在init方法中执行某些操作,这将解决您的问题。否则,您可以完全跳过init方法 试着这样做,可能会奏效 返回(self=[super initWithFrame:frame]) 这可确保将超类方法正确复制到当前方法
TNQ我终于找到了问题: 我需要编写第二个init方法。问题是以下代码执行了两次:
CAEAGLLayer *eaglLayer = (CAEAGLLayer *)[super layer];
[eaglLayer setOpaque:YES];
m_context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1];
if (!m_context || ![EAGLContext setCurrentContext:m_context]) {
printf("FAIL \n");
[self release];
return nil;
}
[Textures loadTexture];
if ([self createFramebuffer]) {
[self draw];
}
此代码位于game类的initFrame
方法中。我创建了第二个不执行此代码的init方法。相反,此代码在克隆的父视图类中执行。现在它工作了,耶!!
谢谢你试着帮助我 你发布的代码似乎没问题。。问题不在于继承。。。如果直接使用,您的“GameView”渲染是否正确???您发布的代码没有问题,我认为您需要进一步解释。@lukya:是的,如果直接使用,游戏显示效果很好!这就是我有点困惑的原因。谢谢,我先试过了,但也没用!有点不对劲,但我不知道是什么。