【问题标题】:Inheritance in Objective CObjective C 中的继承
【发布时间】:2011-07-21 11:29:11
【问题描述】:

我有一个使用 Open GL 渲染游戏的主游戏类。现在我想我可以从这个类继承,然后在它的 init 方法中调用[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 上下文。难道这就是它不起作用的原因吗?

【问题讨论】:

  • 您发布的代码似乎没问题.. 问题不在于继承...如果直接使用,您的“GameView”是否正确渲染???
  • 你贴的代码没有问题,我觉得你需要解释一下。
  • @lukya: 是的,如果直接使用游戏显示很好!这就是为什么我有点困惑。

标签: iphone objective-c


【解决方案1】:

如果您没有在CloneViewinit 函数中添加任何内容,那么您甚至不必重写它。你可以让你的类从GameView继承,它会自动复制它的init函数。

【讨论】:

  • 谢谢,我先试过了,还是不行!出了点问题,但我不知道是什么问题。
【解决方案2】:

这是来自苹果docs

您应该将 self 分配给初始化器返回的值,因为初始化器可能返回一个与原始接收器返回的对象不同的对象。

所以尝试这样做

-(id)initWithFrame:(CGRect)frame{
    if(self = [super initWithFrame:frame] ) {
         //Do whatever you need to do here. 
    }
    return self;
 }

如果您需要在 init 方法中执行某些操作,这应该可以解决您的问题。否则,您可以完全跳过 init 方法。

【讨论】:

    【解决方案3】:

    尝试这样做可能会起作用..

    return(self=[super initWithFrame:frame]) 确保超类方法正确复制到当前方法

    TNQ

    【讨论】:

      【解决方案4】:

      我终于找到了问题:

      我需要编写第二个初始化方法。问题是以下代码被执行了两次:

      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];
      }
      

      此代码在游戏类的initFrame 方法中。我制作了第二个不执行此代码的 init 方法。相反,此代码在克隆的父视图类中执行。现在它起作用了,耶! 感谢您尝试帮助我!

      【讨论】:

        猜你喜欢
        • 2013-09-26
        • 2012-03-10
        • 1970-01-01
        • 2011-05-10
        • 2014-03-08
        • 2016-05-16
        • 2014-04-30
        • 1970-01-01
        相关资源
        最近更新 更多