2012-02-26 102 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中將消息發送給零指針是合法的,但在這種情況下將不會調用任何方法。