2012-02-26 112 views
0

我正在研究iPhone应用程序。我需要在.mm文件中调用一个方法。这个问题在这里被简化的版本:如何从目标c类调用.mm文件的方法

ViewHelper.h

- (void)testMtd; 

ViewHelper.mm(注意这是.mm)

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

SomeViewController.m(进口为了清楚起见省略了查看帮助h)

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

我在日志中看到“之前”和“之后”,但“Call reached mm”永远不会打印。在.mm文件中是否有特殊的规则调用obj c方法?我在这里错过了什么?

+0

你是如何声明和初始化'viewHelper'? – sch 2012-02-26 10:36:09

+2

另外需要注意的是,如果你在**。mm **文件中编写你的类,它仍然是一个正常的Objective-C类。唯一改变的是你可以在**。mm **文件中调用C++代码。 – sch 2012-02-26 11:23:58

+0

@sch是我错过了初始部分!感谢您的指示和澄清reg .mm – Ravi 2012-02-27 01:46:31

回答

1

首先,它与.mm文件无关,它仍然是客观的。其次,您的错误不是分配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"); 
    } 
+0

这是像上午3点30分,当我发布的问题,但天哪,我怎么错过了!感谢HelmiB的回答。 – Ravi 2012-02-27 01:43:48

+0

很高兴帮助:) – HelmiB 2012-02-27 02:45:20

0

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