【问题标题】:Unable to call an Objective C method from a C function无法从 C 函数调用 Objective C 方法
【发布时间】:2008-11-20 10:28:11
【问题描述】:

我正在为 GUI 应用程序使用 MVC 架构。模型类有一些 C 函数。其中一个 C 函数调用了 Objective-C 类的一些方法。我使用该类的对象调用这些方法。发生的奇怪事情是 xyz 方法之前的方法被完美地调用,但是当 xyz 方法被调用时,该方法和它之后的方法都没有被执行。 我没有收到任何错误。所以无法弄清楚到底发生了什么。 关于这可能是什么原因的任何想法?

【问题讨论】:

  • 你能贴一些代码吗?否则将无法提供帮助。
  • 我同意这个请求。一些简单的代码会很有帮助。例如。只是 C 函数的一些代码显示了您如何实际访问 obj-c 对象以及如何调用它可能会很有帮助

标签: objective-c


【解决方案1】:

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

这是调用 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];
}

【讨论】:

  • 老兄,你摇滚。我为此浪费了美好的一天,而您的代码只是挽救了原本糟糕的一天。我希望我能再给你投票 100 次。
  • 顺便说一句,这只适用于单身人士。如果您实例化多个对象,则 refToSelf 指针将仅指向最后一个对象。
  • @Zaph0d42 - 你是对的。如果需要调用多个实例的 C 回调,则 C 函数可以有一个 void * 参数用于传递 ObjC 引用。
  • 天哪。对于 Space-Jesus 的爱,请将id self 设置为otherCfunction 的参数。否则,Aqua-Buddha 肯定不会将您的种子延续到永恒。
  • @Jonathan Sterling - 您假设您控制 C 函数的原型,但情况并非总是如此。混合 ObjC/C 调用可能与回调函数有关,在某些情况下,回调签名不包括通常的 void * 参数,该参数允许传递 ObjC 段的句柄。
【解决方案2】:

您绝对可以通过 C 函数在 Obj-C 对象上运行方法,因此您的代码中可能在某些时候出现错误。如果我不得不猜测,当你不希望它是一个对象时,听起来它是 nil 。通常,您首先会在函数中设置断点,这样您就可以找出相关对象的状态。

【讨论】:

    【解决方案3】:

    在xyz之前的方法上断点,然后在调试器中开始单步执行。通过单步调试器中的代码,您可以发现多少错误,这真是令人惊讶。事实上,这实际上是一种推荐的避免错误的技术,对于您编写的任何新代码,始终单步执行代码。

    我同意 Marc 的观点,“那个方法和它之后的方法没有被执行”的经典原因是对象引用是 nil,因为 [nil doAnything] 不会做任何事情并且不会报告错误。

    【讨论】:

      【解决方案4】:

      有一个简单的方法来做到这一点:

      @implementation
      // Define a object
      ClassName *thisClass;
      

      然后用 self 初始化

      thisClass = self;
      

      您可以在 C-Method 中使用任何 var 和方法

      【讨论】:

        猜你喜欢
        • 2010-11-06
        • 2023-03-29
        • 2013-12-23
        • 1970-01-01
        • 2020-06-22
        • 2011-05-26
        • 2014-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多