【问题标题】:MonoTouch/Obj-C Binding How-ToMonoTouch/Obj-C 绑定方法
【发布时间】:2012-01-03 09:15:35
【问题描述】:

我正在努力为 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 社区 - 我希望 :)

【问题讨论】:

  • 你能把你的完整样品寄给我看吗?
  • 你可以通过在getMessage中添加一个NSLog来测试ObjectiveC方法“getMessage”是否被执行,这可能表明你的库存在链接问题

标签: objective-c binding xamarin.ios


【解决方案1】:

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

这就是 Objective-C 中的以下代码不会崩溃的原因:

id foo = null; [foo.bar.baz saySomething:@"Hello"]

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

【讨论】:

  • 作为一个小附录,我想声明我能够通过编辑 Makefile 来为每个架构构建 Xcode 库项目本身,然后使用 lipo 组合来解决。你可以看到这个完成here。再次感谢 Miguel。
  • Objective-C 不会“在将消息发送到不存在的对象时静默失败”。按照设计,向 NULL 发送消息会返回 0/NULL——这是 Obj-C 开发中的一个重要模式,并且极大地简化了错误检查。但是,向已不存在的对象发送消息是非法的,并且通常会崩溃。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多