从C函数中无法调用Objective C方法

15

我正在使用MVC架构开发一个GUI应用程序。模型类中有一些C函数。其中一个C函数调用了Objective-C类的一些方法。我使用该类的对象来调用这些方法。奇怪的是,在调用xyz方法之前的方法都被完美地调用,但在调用该方法及其后面的方法时却没有执行。 我没有收到任何错误信息。所以无法确定到底发生了什么。 有什么想法可以解决这个问题吗?


你能贴一些代码吗?否则将无法提供帮助。 - Jason Coco
我支持这个请求。一些简单的代码将非常有帮助。例如,展示如何访问 obj-c 对象以及如何调用它的 C 函数的一些代码可能非常有帮助。 - Mecki
4个回答

56

正如Marc所指出的那样,您可能在objective-c范围之外使用了未初始化的OBJC对象的引用。

这是一个调用ObjC对象方法的C代码示例:

#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
兄弟,你太棒了。我浪费了一整天的时间,而你的代码拯救了这个本来糟糕的日子。真希望我能再给你点赞100次。 - eviljack
1
顺便提一句,这只适用于单例模式。如果你实例化多个对象,refToSelf指针将仅指向最后一个对象。 - Brian
@Zaph0d42 - 你是对的。如果需要调用多个实例的 C 回调,则 C 函数可以具有 void * 参数,以传递 ObjC 引用。 - diciu
我的天啊。为了太空耶稣的爱,请把“id self”作为“otherCfunction”的参数。否则,水绿色佛祖肯定不会让你的种子延续到永恒。 - Jonathan Sterling
1
@Jonathan Sterling - 你假设你控制C函数的原型,但并非总是如此。混合ObjC/C调用可能与回调函数有关,在某些情况下,回调签名不包括通常的void *参数,这将允许传递ObjC段的句柄。 - diciu

1
你肯定可以在 C 函数中运行 Obj-C 对象的方法,所以很可能你的代码在某些地方出错了。如果我猜的话,听起来就像是一个对象在你不希望它为空的时候为空了。通常你可以从函数中设置断点开始,这样你就能找出相关对象的状态了。

1

在xyz方法之前设置断点,然后在调试器中开始单步执行。通过在调试器中单步执行代码,您会惊讶地发现有多少错误可以被发现。事实上,这是一种推荐的错误避免技术,对于您编写的任何新代码都应该进行单步执行。

我同意Marc的观点,“该方法及其后续方法未被执行”的经典原因是对象引用为nil,因为[nil doAnything]将不执行任何操作并报告没有错误。


0

有一个简单的方法来实现这个:

@implementation
// Define a object
ClassName *thisClass;

然后使用self进行初始化

thisClass = self;

在 C-Method 中,您可以使用任何变量和方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接