代码之家  ›  专栏  ›  技术社区  ›  Philip Regan

可能的循环参考问题

  •  0
  • Philip Regan  · 技术社区  · 16 年前

    我不是白痴,但是头文件有时让我觉得自己像个白痴。我有可能是一个过于复杂的设置,有一个我无法解决的错误。在这里,它是最简单的细节,我可以使它…

    • 我有一个包含模型类的控制器类。
    • 我有一个场景类来捕捉动作并与控制器通信。
    • 我有一个层类,它与模型类进行对话以输出模型的状态。
    • 场景类包含仅用于输出的层类。
    • 场景必须包含由cocos2d框架确定的层。
    • 特定的场景类派生自包含对控制器类的引用的rootscene类。
    • 特定的层类派生自包含对模型类的引用的rootlayer类。
    • 控制器负责创建场景,场景负责创建层。

    当生成一个层并将控制器的模型传递到该层的模型(在 AScene.m )我得到的是“对成员‘模型’的要求,不是结构或联合体”。演员阵容不起作用,我也不知道如何让这些课程互相交流。我认为部分问题可能是控制器类包含模型类。

    控制器H

    #import <Foundation/Foundation.h>
    
    @class Model;
    @class AScene;
    
    @interface Controller : NSObject {
        Model *Model;
    }
    @property (nonatomic, retain) Model *Model;
    -(void)runScene;
    

    控制器M

    #import "Controller.h"
    
    #import "Model.h"
    #import "AScene.h"
    
    @implementation Controller
    
    @synthesize Model;
    
    - (void)runScene {
        AScene *newScene = [[AScene alloc] init];
        newScene.controller = self;
    }
    

    RooSt.h

    #import "cocos2d.h"
    
    @class Controller;
    
    @interface RootScene : Scene {
        Controller *controller;
    }
    @property (nonatomic, retain) Controller *controller;
    
    @end
    

    根目录

    #import "RootScene.h"
    #import "Controller.h"
    
    @implementation RootScene
    
    @synthesize controller;
    
    - (id) init {
        self = [super init];
        if (self != nil) {
            //
        }
        return self;
    }
    
    - (void) dealloc {
        [controller release];
        [super dealloc];
    }
    
    @end
    

    天冬氨酸

    #import "RootScene.h"
    
    @class ALayer;
    @class Model;
    
    @interface AScene : RootScene {
    }
    
    @end
    

    山羊草

    #import "AScene.h"
    #import "ALayer.h"
    #import "Model.h"
    
    @implementation AScene
    
    - (id) init {
        self = [super init];
        if (self != nil) {
            ALayer *newLayer = [ALayer node];
            newLayer.model = controller.Model; // <-- Request for member 'Model' in something not a stucture or union
            [self addChild:statusScreenLayer];
        }
        return self;
    }
    
    - (void) dealloc {
        [super dealloc];
    }
    
    @end
    

    根层

    #import "cocos2d.h"
    
    @class Model;
    
    @interface RootLayer : Layer {
        Model *model;
    }
    @property (nonatomic, retain) Model *model;
    
    @end
    

    根层

    #import "RootLayer.h"
    
    #import "Model.h"
    
    @implementation RootLayer
    
    @synthesize model;
    
    - (id) init {
        self = [super init];
        if (self != nil) {
            //
        }
        return self;
    }
    
    - (void) dealloc {
        [model release];
        [super dealloc];
    }
    
    @end
    

    一层一层

    #import "RootLayer.h"
    
    @interface ALayer : RootLayer {
    }
    -(void) draw;
    
    @end
    

    阿拉耶.M

    #import "ALayer.h"
    
    @implementation ALayer
    
    -(void) draw {
        // draw based on state of the model
    }
    
    @end
    
    2 回复  |  直到 16 年前
        1
  •  3
  •   Nikolai Ruhe    16 年前

    你的实施 AScene #import 页眉 Controller .

    编辑: 明确的解决方案。

    在ascence.m中添加:

    #import "Controller.h"
    
        2
  •  1
  •   Quinn Taylor    16 年前

    尼古拉似乎是对的。除此之外,最佳实践还要求属性(如ivars)不能以大写字母开头。你只是在请求伤害。用这些代替:

    控制器H

    @interface Controller : NSObject {
        Model *model;
    }
    @property (nonatomic, retain) Model *model;
    

    控制器M

    @synthesize model;