2011-12-30 1 views
0

내 코코아 응용 프로그램에서 firebreath 프로젝트로 분산 알림을 보내야하므로 내 firebreath 코드에서 관찰자와 선택기를 만들어야합니다. objective-c 코드를 지원하기 위해 클래스 확장을 ".mm"으로 변경했습니다. 내 firebreath 프로젝트에 이미 objective-c 코드가 있으며 괜찮습니다. 그러나 관찰자를 만들려고 할 때 코드에 오류가 발생하며이를 해결하는 방법을 모르겠습니다. 여기 내 Firebreath 프로젝트에 NSDistributedNotification 옵저버를 추가해야합니다.

//This is the selector 
- (void)receiveAppConfirmationNotification:(NSNotification*)notif{ 
    //The application is alive. 
    NSLog(@"The application is alive!!!!!!!!"); 
} 

std::string MyProjectAPI::bgp(const std::string& val) 
{  
    //Add an observer to see if the application is alive. 
    NSString *observedObject = @"com.test.net"; 
    NSDistributedNotificationCenter *center = [NSDistributedNotificationCenter defaultCenter]; 
    [center addObserver: self 
       selector: @selector(receiveAppConfirmationNotification:) 
        name: @"App Confirmation Notification" 
       object: observedObject]; 
} 

내 오류가 있습니다 : 여기

는 firebreath 프로젝트에서 내 소스 코드

은 는

... firebreath /../ 프로젝트/MyProject를/MyProjectAPI.mm : 133 : 오류 : 예상 '-'토큰 앞에 unqualified-id가 있습니다. 이것은 "receiveAppConfirmationNotification"메소드를 정의한 라인입니다.

... firebreath /../project/MyProject/MyProjectAPI.mm : 157 : 오류 : 'self'가이 범위에서 선언되지 않았습니다.

선택기를 정의하려면 어떻게해야합니까? 옵저버를 클래스 자체로 추가하려면 어떻게해야합니까?

답변

0

선택자는 objective-C++ 클래스의 일부 여야합니다. 당신은 아무 곳에도 놓을 수 없으며 클래스의 @implementation 섹션에 있어야합니다.

가능한 한 호환성을 유지하려면 .h 파일이 C++과 호환되도록 @interface 및 @implementation 섹션을 .mm 파일에 두는 것이 좋습니다. 당신이 그렇게한다면 그것은 더 쉬울 것입니다. 당신이 원한다면 pimpl 패턴을 사용하여 이것을 도울 수 있습니다.

+0

목표 C 객체를 사용하는 몇 가지 사례가있다 firebreath 코드베이스에서 firebreath와 함께. – taxilian

0

나는 인터페이스와 구현을 했으므로 코드는 오류없이 수행됩니다. 문제는 내 코코아 응용 프로그램에 알림을 보낼 수 있지만 응용 프로그램에서 플러그인으로 알리미를받을 수 없다는 것입니다. 여기

@implementation FBMyProject 
@synthesize parameter_val; 

    -(void) receiveAppConfirmationNotification:(NSNotification*)notif{ 
     //The application is alive. 
     NSLog(@"The application is alive!!!!!!!!"); 
    } 

    - (id)init 
    { 
     self = [super init]; 
     if (self) { 
      NSString *observedObject = @"test.com"; 
      NSDistributedNotificationCenter *center = [NSDistributedNotificationCenter defaultCenter]; 
      [center addObserver: self 
        selector: @selector(receiveAppConfirmationNotification:) 
         name: @"App Confirmation Notification" 
         object: observedObject]; 

     } 
     return self; 
    } 

    - (void)dealloc 
    { 
     // unregister notification 
     [[NSDistributedNotificationCenter defaultCenter] removeObserver: self 
                   name: @"App Confirmation Notification" 
                   object: nil]; 

     [self.parameter_val release]; 
     [super dealloc]; 
    } 
@end 



std::string MyProjectAPI::bgp(const std::string& val) 
{  
    FBMyProject *my_project = [[FBMyProject alloc] init]; 
    my_project.parameter_val = [NSString stringWithUTF8String:val.c_str()]; 
    [my_project release]; 

    return val; 
} 

는 코코아 응용 프로그램에서 내 소스 : 여기
#ifdef __OBJC__ 

@interface FBMyProject : NSObject { 
    NSString *parameter_val; 
} 

@property (nonatomic, retain) NSString *parameter_val; 

-(void) receiveAppConfirmationNotification:(NSNotification*)notif; 

@end 
#endif 

class MyProjectAPI : public FB::JSAPIAuto 
{ 
    public: 
    ... 
} 
#endif 

내 소스 파일입니다 다음 헤더 파일입니다

NSDictionary *data = [NSDictionary dictionaryWithObjectsAndKeys: 
         @"OK", @"confirmation", 
         nil]; 

//Post the notification 
NSString *observedObject = @"test.com"; 
NSDistributedNotificationCenter *center = [NSDistributedNotificationCenter defaultCenter]; 
[center postNotificationName: @"App Confirmation Notification" 
         object: observedObject 
        userInfo: data 
      deliverImmediately: YES]; 
+0

이 줄을 제거하면 "[my_project release];" 알림이 작동하지만 메모리를 해제해야합니다. 나는 autorelease를 할 수 없다. 어떤 아이디어? – Ana