Невозможно вызвать метод Objective C из функции C

Я использую архитектуру MVC для приложения GUI. Класс модели имеет некоторые C-функции. Одна из функций C вызывает некоторые методы класса Objective-C. Я вызываю эти методы, используя объект этого класса. Странная вещь заключается в том, что методы, ранее используемые для метода xyz, называются отлично, но когда этот метод xyz вызывается, этот метод и методы после него не выполняются. У меня нет ошибок. Так что не могу понять, что именно происходит. Любые идеи относительно того, что может быть причиной этого?

Ответы

Ответ 1

Как указывает Марк, вы, вероятно, используете ссылку на объект OBJC, который не инициализирован вне области objective-c.

Здесь рабочий пример кода C, вызывающий объект Object:

#import <Cocoa/Cocoa.h>

id refToSelf;

@interface SomeClass: NSObject
@end

@implementation SomeClass
- (void) doNothing
{
        NSLog(@"Doing nothing");
}
@end

int otherCfunction()
{
        [refToSelf doNothing];
}


int main()
{

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    SomeClass * t = [[SomeClass alloc] init];
    refToSelf = t;

    otherCfunction();

    [pool release];
}

Ответ 2

Вы можете определенно запускать методы объектов Obj-C из функции C, поэтому, вероятно, в какой-то момент в вашем коде будет ошибка. Если бы я должен был догадаться, это звучит так, как если бы вы не ожидали, что объект будет нулевым. Как правило, вы начинаете с установки точек останова в своей функции, чтобы вы могли узнать, что представляет собой состояние объектов.

Ответ 3

Точка останова по методу перед xyz, а затем начать одиночный шаг в отладчике. Его удивительное количество ошибок, которые вы можете обнаружить, одним нажатием кода в отладчике. Фактически, это на самом деле рекомендуемый метод избегания ошибок, чтобы всегда выполнять один шаг через код для любого нового кода, который вы пишете.

Я согласен с Марком, классическая причина "этого метода и методов после того, как он не выполняется" заключается в том, что ссылка на объект равна нулю, поскольку [nil doAnything] ничего не делает и не сообщает об ошибке.

Ответ 4

Вот простой способ сделать это:

@implementation
// Define a object
ClassName *thisClass;

а затем init с self

thisClass = self;

Вы можете использовать любые var и методы в C-методе