MonoTouch / Obj-C绑定方法

时间:2012-01-03 09:15:36

标签: objective-c binding xamarin.ios

我正在为Obj-C库创建绑定,以便我可以在同一个项目中与另一个团队一起工作。为了确保这一点,我正在尝试创建一个简单的obj-c库,定义绑定,并在MonoTouch中使用该对象。我没有构建问题甚至运行时异常,但调用任何函数的返回值始终为null。

我首先使用Xcode创建了一个新的静态库,并定义了一个“计算器”类。下面是.h和.m

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

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

这内置于文件'libXcodeLib.a'中。我为这个类和方法定义了以下MonoTouch绑定:

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

以及gcc_flags的附加AssemblyInfo.cs,其中包含以下内容:

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

最后,我们来看看用于生成.dll文件的Makefile

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();

此时,为什么msg为NULL?

从我所做的所有阅读中,我无法看到我缺少的东西使这项工作。任何更新或经过验证的样本/教程都会受到高度赞赏,我不确定如何更简化这一点 - 但它仍然不起作用!

感谢SO社区 - 我希望:)

1 个答案:

答案 0 :(得分:2)

我查看了Matt的软件包,我发现他的库是一个仅限ARM的库。当在模拟器中运行时,代码将不会被链接,并且当消息被发送到空对象时,Objective-C喜欢以静默方式继续执行。

这使得Objective-C中的以下代码不会崩溃:

id foo = null; [foo.bar.baz说某事:@“你好”]

尽管foo为null。在这种情况下,当代码无法加载Calculator类时,它基本上没有说什么。所有消息都被愉快地发送,但是Objective-C运行时一直在继续。