Невозможно вызвать метод Objective C из функции C - PullRequest
16 голосов
/ 20 ноября 2008

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

Ответы [ 4 ]

56 голосов
/ 20 ноября 2008

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

Вот рабочий пример кода C, вызывающего метод объекта ObjC:

#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];
}
1 голос
/ 18 июня 2009

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

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

1 голос
/ 20 ноября 2008

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

0 голосов
/ 18 мая 2017

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

@implementation
// Define a object
ClassName *thisClass;

и затем init с самим собой

thisClass = self;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...