Как правильно загрузить мой класс? - PullRequest
0 голосов
/ 21 сентября 2011

У меня есть класс, определенный во внешней паре файлов, назовем их engine.h и engine.m . Также мне был предоставлен файл «engineListener.h». вот как они выглядят:

Файл engine.h:

@interface coreEngine: NSObject {
   NSString *displaydValue;
   id <coreEngineListener> listener;
}
-(coreEngine*)initWithListener:(id <coreEngineListener>) _listener;
//...

Файл engine.m

//imports here
@interface coreEngine()
-(Boolean) MyOperation: ... ... (etc)
@end

Файл engineListener.h

//imports here...
@class coreEngine;
@protocol coreEngineListener <NSObject>
@required
-(void) someVariable:(coreEngine *)source;
@end

Теперь, в моем myController.h У меня есть это:

//... imports and include ...
@interface myController : NSObject
{
    coreEngine *PhysicsEngine;
}

- (IBAction)doSomething:(id)sender;

А в myController.m вот что у меня есть:

-(id) init
{
    NSAutorelease *pool = [[NSAutoreleasePool alloc] init];
    coreEngine *PhysicsEngine = [[coreEngine alloc] init];

    [PhysicsEngine release];
    [pool drain];
    return self;
}

- (IBAction)doSomething:(id)sender
{
    [PhysicsEngine MyOperation:Something];
}

Дело в том, что код компилируется правильно, но «[PhysicsEngine MyOperation: Something]» ничего не делает. Я уверен, что я инстанцирую свой класс неправильно. NSObject, определенный в "engine.h engine.m и enginelistener.h", который я должен загрузить, не был создан мной, и у меня нет средств для его изменения.

Я пытался делать какие-то фиктивные / случайные вещи, основываясь на том, что я видел в Интернете, не зная на 100%, что я делал. Я даже близко не знаком с ObjectiveC или C / C ++, поэтому будьте осторожны со мной. Я совершенно нуб на эту тему. Я использую Xcode 4, и у меня также есть доступ к XCode 3.2.6

Как мне правильно загрузить свой класс? Любой совет приветствуется. Спасибо

Ответы [ 2 ]

1 голос
/ 21 сентября 2011

Ваш класс -init должен выглядеть примерно так:

- (id)init
{
    self = [super init];

    if (self != nil)
    {
        coreEngine = [[PhysicsEngine alloc] initWithListener:self];    // I assume you don't have a property declared
    }

    return self;
}

Это следует стандартному шаблону проектирования для инициализации классов. Вы фактически делаете инициализацию, вызывая -init на super. После этого, если self был правильно инициализирован (как это будет почти всегда), вы создаете объект PhysicsEngine. Обратите внимание, что ваш класс должен соответствовать протоколу PhysicsEngineListener и реализовать -someVariable:.

// Declares protocol conformance

@interface MyController : NSObject <PhysicsEngineListener>

// In MyController.m

- (void)someVariable:(PhysicsEngine *)source
{
    // Do whatever this is supposed to do
}
1 голос
/ 21 сентября 2011

Ваш интерфейс должен иметь:

PhysicsEngine *coreEngine;

и MyController.m init:

PhysicsEngine *coreEngine = [[PhysicsEngine allow] init];

Я был бы удивлен, если бы ваш код вообще компилировался.

Кроме того, соглашение состоит в том, что классы пишутся с большой буквы, а переменные - нет. Есть, вероятно, еще кое-что прокомментировать, но вы должны начать с этого.

...