2012-02-26 6 views
0

나는 iPhone 응용 프로그램을 작성 중입니다. .mm 파일로 메소드를 호출해야합니다. 문제의 여기 단순화 된 버전 :목표 C 클래스에서 .mm 파일에 대한 메서드 호출하는 방법

ViewHelper.h

- (void)testMtd; 

ViewHelper.mm는

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

SomeViewController.m (가져 오기 (이 .mm 예고) ViewHelper.h에서 명확성을 위해 생략)

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

로그에 "before"및 "after"가 표시되지만 "Call reached mm"이 인쇄되지 않습니다. .mm 파일에서 obj 메소드를 호출하는 특별한 규칙이 있습니까? 내가 여기서 무엇을 놓치고 있니?

+0

은 어떻게 선언하고'viewHelper'를 초기화 했습니까? – sch

+2

** .mm ** 파일 안에 클래스를 작성하는 경우, 이는 여전히 일반적인 Objective-C 클래스로 남아 있습니다. 변경되는 유일한 점은 ** .mm ** 파일 내부에서 C++ 코드를 호출 할 수 있다는 것입니다. – sch

+0

@sch 예 init 부분을 놓쳤습니다. 포인터와 설명을위한 감사합니다 reg .mm – Ravi

답변

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.30am와 같았다. 그러나 어떻게 내가 그것을 그리워 했느냐! 답변 HelmiB 주셔서 감사합니다. – Ravi

+0

도움이되어 기쁩니다 :) .. .. – HelmiB

0

-testMtd 메서드가 호출되지 않는 가장 큰 이유는 viewHelper이 nil이라는 것입니다. ViewHelper 클래스의 유효한 인스턴스를 가리키는 지 확인하십시오. Objective-C에서는 nil 포인터에 메시지를 보내는 것이 합법적이지만이 경우 호출되는 메서드는 없습니다.

관련 문제