如何在c++中,调用objective-c

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在c++中,调用objective-c相关的知识,希望对你有一定的参考价值。

Using C++ With Objective-C
苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C++和Objective-C,混编后的语言叫Objective-C++。有了它,你就可以在Objective-C应用程序中使用已有的C++类库。

Objective-C和C++混编的要点
在Objective-C++中,可以用C++代码调用方法也可以从Objective-C调用方法。在这两种语言里对象都是指针,可以在任何地方使用。例如,C++类可以使用Objective-C对象的指针作为数据成员,Objective-C类也可以有C++对象指针做实例变量。下例说明了这一点。
注意:Xcode需要源文件以".mm"为扩展名,这样才能启动编译器的Objective-C++扩展。
复制代码
/* Hello.mm
* Compile with: g++ -x objective-c++ -framework Foundation Hello.mm -o hello
*/
#import <Foundation/Foundation.h>
class Hello
private:
id greeting_text; // holds an NSString
public:
Hello()
greeting_text = @"Hello, world!";

Hello(const char* initial_greeting_text)
greeting_text = [[NSString alloc] initWithUTF8String:initial_greeting_text];

void say_hello()
printf("%s/n", [greeting_text UTF8String]);

;
@interface Greeting : NSObject
@private
Hello *hello;

- (id)init;
- (void)dealloc;
- (void)sayGreeting;
- (void)sayGreeting:(Hello*)greeting;
@end
@implementation Greeting
- (id)init
if (self = [super init])
hello = new Hello();

return self;

- (void)dealloc
delete hello;
[super dealloc];

- (void)sayGreeting
hello->say_hello();

- (void)sayGreeting:(Hello*)greeting
greeting->say_hello();

@end
int main()
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

Greeting *greeting = [[Greeting alloc] init];
[greeting sayGreeting]; // > Hello, world!

Hello *hello = new Hello("Bonjour, monde!");
[greeting sayGreeting:hello]; // > Bonjour, monde!

delete hello;
[greeting release];
[pool release];
return 0;


正如你可以在OC接口中声明C结构一样,你也可以在OC接口中声明C++类。跟C结构一样,OC接口中定义的C++类是全局范围的,不是OC类的内嵌类(这与标准C(尽管不是C++)提升嵌套结构定义为文件范围是一致的)。
为了允许你基于语言变种条件化地编写代码,OC++编译器定义了__cplusplus和__OBJC__预处理器常量,分别指定C++和OC。 如前所述,OC++不允许C++类继承自OC对象,也不允许OC类继承自C++对象。
复制代码
class Base /* ... */ ;
@interface ObjCClass: Base ... @end // ERROR!
class Derived: public ObjCClass ... // ERROR!

与OC不同的是,C++对象是静态类型的,有运行时多态是特殊情况。两种语言的对象模型因此不能直接兼容。更根本的,OC和C++对象在内存中的布局是互不相容的,也就是说,一般不可能创建一个对象实例从两种语言的角度来看都是有效的。因此,两种类型层次结构不能被混合。
你可以在OC类内部声明C++类,编译器把这些类当作已声明在全局名称空间来对待。就像下面:
复制代码
@interface Foo
class Bar ... // OK

@end
Bar *barPtr; // OK

OC允许C结构作为实例变量,不管它是否声明在OC声明内部。
复制代码
@interface Foo
struct CStruct ... ;
struct CStruct bigIvar; // OK
... @end
参考技术A C++和Objective-C都是从C语言发展来的面向对象语言,但C++的是在编译期的面向对象,Objective-C的是在运行期的面向对象,Objective-C历史并不比C++短,两者可以认为没联系

在 Objective-C 中使用分布式对象 (DO) 时如何确定调用对象?

【中文标题】在 Objective-C 中使用分布式对象 (DO) 时如何确定调用对象?【英文标题】:How to determine the calling object when using Distributed Objects (DO) in Objective-C? 【发布时间】:2012-01-05 02:49:24 【问题描述】:

我在 Objective-C 中使用分布式对象 (DO)。我有一个在网络上出售的“服务器”对象。网络上的其他对象有我的服务器对象的代理,因此可以调用服务器对象上的方法。但是,我可以确定有关在服务器对象上调用方法的对象的任何信息吗?也就是说,我有许多可以调用服务器的“客户端”对象,我想区分这些对象。另外,我能否确定这些对象的其他属性,例如主机名、唯一标识符?

【问题讨论】:

您应该能够辨别是哪个连接(因此客户端设备)在您的服务器上发出了请求,但我认为这个问题还有更多 @CSteel 你说的是NSConnection吗? 您可以将此信息作为参数发送到服务器。 @jennifer 你能更具体地说明这个参数是什么类型吗? 【参考方案1】:

我遇到了类似的问题。我发现识别客户端的一种可能方法是让它们将某种令牌对象作为每次调用的一部分传递给服务器。在服务器上你可以这样做:

NSConnection* clientConnection = [passedTokenObject connectionForProxy];

这将为您提供连接句柄,该句柄对于每个客户端都是唯一的。您能否获得所需的信息取决于 Apple 允许您使用该连接对象做什么。

在我的应用程序中,我让客户首先进行“注册”调用,我用它来收集我需要的关于他们的信息。

另一件可能有用的事情是成为用于出售服务器对象的 NSConnection 的 NSConnectionDelegate。这将使您可以访问这些方法:

- (BOOL)connection:(NSConnection *)parentConnection shouldMakeNewConnection:(NSConnection *)newConnnection 
    //  You can inspect new connection being established here and maybe glean info about the client
    return YES;


- (BOOL) connection:(NSConnection *)c handleRequest:(NSDistantObjectRequest*)doReq 
    //  You get to see every method that is invoked here and can maybe glean info that you need.
    //  Returning NO means you're just snooping on the call and it will be handled in the normal way.
    return NO;

我发现可用的“工具”还不够,我需要重新设计我出售的 API 以帮助提供我需要的信息。

【讨论】:

感谢您的信息。出于好奇,客户在“注册”时向您提供了哪些信息?【参考方案2】:

我发现解决这个问题最有效的方法是显式传递对调用对象的引用作为方法的第一个参数。这样,调用对象可以很容易地被识别,甚至在必要时回调。结果参数的类型为NSDistantObject *

【讨论】:

以上是关于如何在c++中,调用objective-c的主要内容,如果未能解决你的问题,请参考以下文章

如何在 c++ 中调用 c# 方法?

如何在 C++ 中调用大型 python 脚本?

如何在 C++ 中调用基类构造函数 [重复]

如何在 C++ 中的类中递归调用函数方法?

如何在 Clion 中使用虚拟环境从 C++ 调用 Python?

如何避免在 C++ 中调用祖父构造函数?