Objective C++ call Objective C

Objective C++ call Objective C

本文关键字:Objective C++ call      更新时间:2023-10-16

我有一个咆哮动作需要从目标C++调用

- (NSDictionary *) registrationDictionaryForGrowl {
    return [NSDictionary dictionaryWithObjectsAndKeys:
            [NSArray arrayWithObject:@"Alert"], GROWL_NOTIFICATIONS_ALL,
            [NSArray arrayWithObject:@"Alert"], GROWL_NOTIFICATIONS_DEFAULT
            , nil];
}

是Objective C中的操作,但我需要将其放在.mm文件(Objective C++)中,并且我很难正确转换它,因为我需要将它放在(C++)类中的(C++)函数中。

你知道我如何把它转移到ObjectiveC++上吗?

根据我的了解,您希望向Growl提供一个C++对象,Growl需要和Objective-C对象。你不能这样做。

Objective-C是焊接到C上的一组语言扩展。Objective-C++是将完全相同的扩展焊接到C++上的结果。因此,在Objective-C++中,既有Objective-C风格的对象,也有C++对象,它们是完全不同的东西。一个不能在需要另一个时使用。它们有不同的ABI、解决方法调用/消息发送的不同方案、不同的生存期管理等。

Objective-C++的目的不是使Objective-C对象和C++对象兼容,而是简单地使ObjectiveC代码可以从C++中使用,C++代码可以从Objective-CC++中使用。

因此,您可以创建要用作委托的C++类,然后创建一个Objective-C++类,该类封装您的C++类并具有简单转发到C++类实例的方法。

class Foo {
    int bar(int i) { return i+1; }
};
@interface ObjCFoo : NSObject
{
    Foo foo;
}
- (int) bar:(int) i;
@end
@implementation ObjFoo
- (int) bar:(int) i;
{
    return foo.bar(i);
}
@end

在Objective-C++中有C++类和Objective-C类。没有Objective-C++类。实现registrationDictionaryForGrowlGrowlApplicationBridgeDelegate必须是Objective-C对象。您可以在.mm文件中定义与在.m文件中完全相同的值。唯一的区别是,在.mm文件中,您定义的Objective-C类可以调用并使用C++类和语法。

我不知道你怎么称呼Objective-C++,但如果上面的代码位于Objective-C@implementation部分,无论是否启用Objective-CC++(.m.mm扩展),都会编译得很好。

顺便说一句,如果你使用的是Xcode 4.4或更高版本,以下也可以:

- (NSDictionary*) registrationDictionaryForGrowl {
    return @{
        GROWL_NOTIFICATIONS_ALL : @[ @"Alert" ],
        GROWL_NOTIFICATIONS_DEFAULT : @[ @"Alert" ] };
}