【问题标题】:How to call a method on .mm file from a objective c class如何从目标 c 类调用 .mm 文件的方法
【发布时间】:2012-02-26 10:27:12
【问题描述】:

我正在开发一个 iphone 应用程序。我需要在 .mm 文件上调用一个方法。这是问题的简化版本:

ViewHelper.h

- (void)testMtd;

ViewHelper.mm(注意这是.mm)

- (void)testMtd{
   NSLog(@"Call reached mm");
}

SomeViewController.m(为清楚起见,省略了对 ViewHelper.h 的导入)

- (void)someCallerMtd{
   NSLog(@"before");
   [viewHelper testMtd]; //call does not work
   NSLog(@"after");
}

我在日志中看到“之前”和“之后”,但从未打印过“呼叫到达 mm”。在 .mm 文件中调用 obj c 方法是否有特殊规则?我在这里想念什么?

【问题讨论】:

  • 你是如何声明和初始化viewHelper的?
  • 另外注意,如果你在 .mm 文件中编写你的类,它仍然是一个普通的 Objective-C 类。唯一改变的是您可以在 .mm 文件中调用 c++ 代码。
  • @sch 是的,我错过了初始化部分!感谢您的指针和澄清 reg .mm

标签: iphone c++ objective-c methods


【解决方案1】:

首先,它与.mm文件无关,它仍然是objective-c clss。其次,您的错误是没有分配ViewHelper。

解决方案是分配您的ViewHelper 或公开(void)testMtd。取决于你的需要。

要么改变你的SomeViewController.m:

- (void)someCallerMtd{
   NSLog(@"before");
   viewHelper = [[ViewHelper alloc] init];
   [viewHelper testMtd]; 
   [viewHelper release];
   NSLog(@"after");
}

或更改您的ViewHelper:

//ViewHelper.h
+ (void)testMtd;

//ViewHelper.mm
+ (void)testMtd{
   NSLog(@"Call reached mm");
}

- (void)someCallerMtd{
       NSLog(@"before");
       [ViewHelper testMtd]; //remember to use ViewHelper class. not viewhelper.
       NSLog(@"after");
    }

【讨论】:

  • 我发布问题的时候是凌晨 3.30 点,但天哪,我怎么会错过这个!感谢 HelmiB 的回答。
【解决方案2】:

您的-testMtd 方法永远不会被调用的最可能原因是viewHelper 为nil。确保它指向 ViewHelper 类的有效实例。在 Objective-C 中向 nil 指针发送消息是合法的,但在这种情况下不会调用任何方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多