2009-10-24 8 views
0

Я не идиот, но файлы заголовков заставляют меня чувствовать себя как-то иногда. У меня есть, вероятно, слишком сложная настройка, у которой есть ошибка, которую я не могу решить. Здесь он примерно так же прост, как детали, как я могу это сделать.Возможная проблема с круговой ссылкой

  • У меня есть класс контроллера, который содержит класс модели.
  • У меня есть класс Scene для захвата действий и общения с контроллером.
  • У меня есть класс Layer, который говорит с классом Model для вывода состояния модели.
  • Класс Scene содержит класс Layer исключительно для вывода.
  • Сцены должны содержать слои, определенные структурой Cocos2D.
  • Конкретные классы сцен производятся от класса RootScene, который содержит ссылку на класс Controller.
  • Классы специфического уровня производятся от класса RootLayer, который содержит ссылку на класс модели.
  • Контролер отвечает за создание сцен и сцен, ответственных за создание слоев.

Проблема возникает при создании слоя и передаче модели контроллера модели Layer (в AScene.m). Я получаю «Заявку на членскую модель» во что-то, что не является структурой или союзом ». Кастинг не работает, и я не понимаю, как позволить этим классам разговаривать друг с другом. Я думаю, что часть проблемы может заключаться в том, что класс Controller содержит класс 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.ч

#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 
+1

есть возможно столкновение имя. Переменные экземпляра обычно начинаются с нижнего регистра, поэтому, возможно, Model имя класса сталкивается с моделью переменной экземпляра. – notnoop

+0

Вы пробовали: newLayer.model = self.controller.Model? –

ответ

3

Ваша реализация AScene не #import заголовок Controller.

Редактировать: Явное решение.

В AScene.m добавить:

#import "Controller.h" 
+0

Контроллер.h импортируется в родительский класс AScene: RootScene. –

+0

Классы не могут импортировать ничего. Файлы заголовков импортируются файлами реализации или другими файлами заголовков. Вот что я имел в виду с моим ответом: файл реализации AScene («AScene.m») не импортирует «Controller.h», ни прямо, ни опосредованно. –

+0

@Philip, чтобы выполнить то, что вы предположили, вы можете заменить '@class Controller;' в RootScene.h с '#import" Controller.h "'. Как правило, лучше всего минимизировать импорт в заголовках, но в этом случае дочерний класс должен иметь тот же импорт. Поскольку он используется в обоих местах, просто переместите его из файла .m в файл .h. –

1

Николай, похоже, прав. Помимо этого, лучшая практика будет диктовать, что свойства (например, ivars) НЕ должны начинаться с прописной буквы. Ты просто просишь больно. Используйте их вместо того, чтобы:

controller.h

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

Controller.m

@synthesize model; 
+0

«Ты просто просишь больно». В каком смысле? Ожидается ли, что компилятор или Objective-C имеют нижние регистры? –

+1

Это ожидание разработчиков. Если бы вы были единственным разработчиком, который мог бы посмотреть на ваш код, вы могли бы делать то, что хотите. Но это не так. Вы делитесь кодом, поэтому вы должны использовать стиль, который понимают другие. –

+0

Исправить. Предполагается, что ведение заглавной буквы означает класс, структуру и т. Д., А методы, ivars и свойства начинаются с нижнего регистра. Это на самом деле тенденция к большинству языков программирования, поэтому в любое время, когда вы отправляете код, чтобы кто-то помог вам с проблемой, они, вероятно, будут немедленно смущены выбором. (Также обратите внимание на то, как уценка на этом сайте отображает модель Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model Model). предпочтительнее. Но тогда у меня есть серьезные мнения. :-) –

Смежные вопросы