Невозможно вызвать метод 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-методе