problema referência circular possível
-
06-07-2019 - |
Pergunta
Eu não sou um idiota, mas arquivos de cabeçalho me faz sentir como um às vezes. Eu tenho o que é provavelmente um set-up excessivamente complicado que tem um erro que eu não posso resolver. Aqui está em tão simples como detalhes como eu posso fazer isso ....
- Eu tenho uma classe de controlador que contém uma classe Model.
- Eu tenho uma classe cenas a ações de captura e comunica com o controlador.
- Eu tenho uma classe Camada que as negociações com a classe modelo para a saída do estado do modelo.
- A classe Scene contém classe Camada exclusivamente para saída.
- Cenas deve manter Layers como determinado pela estrutura Cocos2D.
- aulas cena específica derivar de uma classe RootScene que mantém a referência à classe Controller.
- aulas camada específica derivar de uma classe RootLayer que mantém a referência à classe Model.
- O controlador é responsável por criar cenas e cenas são responsáveis ??por criar Layers.
O problema surge quando fizer uma camada e passando Modelo do Controlador de Modelo do Layer (em AScene.m
). Recebo o "Pedido de membro do 'Modelo' em algo que não é um stucture ou união". Fundição não funcionar, e eu estou em uma perda para saber como permitir que essas classes para falar uns com os outros. Eu acho que parte do problema pode ser que classe Controller contém a classe Model.
Controller.h
#import <Foundation/Foundation.h>
@class Model;
@class AScene;
@interface Controller : NSObject {
Model *Model;
}
@property (nonatomic, retain) Model *Model;
-(void)runScene;
Controller.m
#import "Controller.h"
#import "Model.h"
#import "AScene.h"
@implementation Controller
@synthesize Model;
- (void)runScene {
AScene *newScene = [[AScene alloc] init];
newScene.controller = self;
}
RootScene.h
#import "cocos2d.h"
@class Controller;
@interface RootScene : Scene {
Controller *controller;
}
@property (nonatomic, retain) Controller *controller;
@end
RootScene.m
#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
AScene.h
#import "RootScene.h"
@class ALayer;
@class Model;
@interface AScene : RootScene {
}
@end
AScene.m
#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
RootLayer.h
#import "cocos2d.h"
@class Model;
@interface RootLayer : Layer {
Model *model;
}
@property (nonatomic, retain) Model *model;
@end
RootLayer.m
#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
ALayer.h
#import "RootLayer.h"
@interface ALayer : RootLayer {
}
-(void) draw;
@end
ALayer.m
#import "ALayer.h"
@implementation ALayer
-(void) draw {
// draw based on state of the model
}
@end
Solução
A implementação de AScene
não #import
o cabeçalho de Controller
.
Editar:. solução explícita ??p>
Em AScene.m add:
#import "Controller.h"
Outras dicas
Nikolai parece estar certo. Além disso, a melhor prática ditaria que as propriedades (como ivars) não deve começar com uma letra maiúscula. Você está apenas pedindo para ter magoado. Use-os em vez disso:
Controller.h
@interface Controller : NSObject {
Model *model;
}
@property (nonatomic, retain) Model *model;
Controller.m
@synthesize model;