2012-01-03 45 views
3

我正在创建的OBJ-C库绑定,这样我可以与其他球队一起在同一个项目。为了确保这样做,我试图创建一个简单的obj-c库,定义绑定,并在MonoTouch中使用该对象。我没有构建问题甚至运行时异常,但是调用任何函数的返回值始终为空。的MonoTouch /对象 - 绑定操作方法

我开始使用Xcode中创建一个新的静态库,并定义了“计算器”类。 .h和.m

@interface Calculator : NSObject 
- (NSString*)getMessage; 
@end 

@implementation Calculator 
- (NSString*)getMessage 
{ 
    return @"hey, look at me!"; 
} 
@end 

将此内置到文件'libXcodeLib.a'中。我定义这个类以下MonoTouch的绑定和方法:对gcc_flags

[BaseType(typeof(NSObject))] 
interface Calculator 
{ 
    [MonoTouch.Foundation.Export("getMessage")] 
    string GetMessage(); 
} 

除了一个额外的AssemblyInfo.cs下列要求:

[assembly: LinkWith ("libXcodeLib.a", LinkTarget.Simulator | LinkTarget.ArmV6 | LinkTarget.ArmV7, ForceLoad = true)] 

最后,下面就来看看在Makefile中产生.dll文件

BTOUCH=/Developer/MonoTouch/usr/bin/btouch 
all: XcodeLib.dll 
XcodeLib.dll: Makefile ApiDefinition.cs AssemblyInfo.cs libXcodeLib.a 
$(BTOUCH) -e ApiDefinition.cs AssemblyInfo.cs --out=XcodeLib.dll --link-with=libXcodeLib.a,libXcodeLib.a 

这里是示例代码调用此方法:

var calc = new MTBindings.Calculator(); 
var msg = calc.GetMessage(); 

在这一点上,为什么味精NULL?

从所有的阅读中,我已经做了,我看不到我错过了什么,使这项工作。任何新的或经过验证的样本/教程都将不胜感激,我不确定如何简化这一点 - 但它仍然行不通!

得益于SO社区 - 我希望:)

+0

你可以运送你的完整样本给我看看吗? – 2012-01-03 12:39:15

+0

你可以测试是否通过在getMessage中添加NSLog来实现ObjectiveC方法“getMessage”,这可能会指向与你的库链接问题 – JeanLuc 2012-01-03 13:40:03

回答

2

我回顾了包从马特和我发现的是,他的图书馆是一个唯一的ARM库。在模拟器中运行时,代码将不会被链接,Objective-C喜欢在向空对象发送消息时以静默方式继续执行。

这是允许在Objective-C不崩溃下面的代码:

ID富= NULL; [foo.bar.baz saySomething:@ “你好”]

尽管富被空。在这种情况下,当代码未能加载Calculator类时,基本上什么都不说。所有消息都被高兴地发送出去,但Objective-C运行时却一直在继续。

+0

作为一个轻微的附录,我想声明我能够通过编辑来解决Makefile为每个架构构建Xcode库项目本身,然后使用lipo进行组合。你可以在这里看到这个(https://github.com/mono/monotouch-bindings/blob/master/facebook/binding/Makefile)。再次感谢米格尔。 – 2012-01-04 03:46:37

+3

当消息发送到不存在的对象时,Objective-C不会“悄然失败”。发送消息到NULL通过设计返回0/NULL - 这是Obj-C开发中的一个重要模式,并且显着简化了错误检查。但是,将消息发送到不存在的对象是非法的,并且通常会崩溃。 – StilesCrisis 2012-01-04 06:32:58