Возможная проблема с циклической ссылкой
-
06-07-2019 - |
Вопрос
Я не идиот, но заголовочные файлы иногда заставляют меня чувствовать себя таковым.У меня, вероятно, чрезмерно сложная настройка, в которой есть ошибка, которую я не могу устранить.Вот это примерно так просто и подробно, как я могу это сделать....
- У меня есть класс контроллера, который содержит класс модели.
- У меня есть класс Scene для захвата действий и взаимодействия с контроллером.
- У меня есть класс Layer, который взаимодействует с классом Model для вывода состояния Модели.
- Класс Scene содержит класс Layer исключительно для вывода.
- Сцены должны содержать слои, как определено платформой Cocos2D.
- Определенные классы сцен являются производными от класса RootScene, который содержит ссылку на класс контроллера.
- Определенные классы слоев являются производными от класса RootLayer, который содержит ссылку на класс Model.
- Контроллер отвечает за создание сцен, а Сцены отвечают за создание Слоев.
Проблема возникает при создании слоя и передаче модели контроллера в Модель слоя (в AScene.m
).Я получаю "Запрос на членскую "модель" в чем-то, что не является структурой или объединением".Кастинг не работает, и я в недоумении, как разрешить этим классам общаться друг с другом.Я думаю, что часть проблемы может заключаться в том, что класс Controller содержит класс Model.
Контроллер.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;
}
Корневая сцена.h
#import "cocos2d.h"
@class Controller;
@interface RootScene : Scene {
Controller *controller;
}
@property (nonatomic, retain) Controller *controller;
@end
Корневая сцена.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
Восхождение.h
#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
Укоренитель.h
#import "cocos2d.h"
@class Model;
@interface RootLayer : Layer {
Model *model;
}
@property (nonatomic, retain) Model *model;
@end
Укоренитель.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
АЛайер.ч
#import "RootLayer.h"
@interface ALayer : RootLayer {
}
-(void) draw;
@end
АЛайер.м
#import "ALayer.h"
@implementation ALayer
-(void) draw {
// draw based on state of the model
}
@end
Решение
Ваша реализация AScene
не делает #import
заголовок из Controller
.
Редактировать: Явное решение.
В AScene.m добавить:
#import "Controller.h"
Другие советы
Николай, похоже, прав.Помимо этого, наилучшая практика диктует, что свойства (например, ivars) НЕ должны начинаться с заглавной буквы.Ты просто напрашиваешься на боль.Используйте их вместо этого:
Контроллер.h
@interface Controller : NSObject {
Model *model;
}
@property (nonatomic, retain) Model *model;
Контроллер.m
@synthesize model;