我正在为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社区 - 我希望:)
答案 0 :(得分:2)
我查看了Matt的软件包,我发现他的库是一个仅限ARM的库。当在模拟器中运行时,代码将不会被链接,并且当消息被发送到空对象时,Objective-C喜欢以静默方式继续执行。
这使得Objective-C中的以下代码不会崩溃:
id foo = null; [foo.bar.baz说某事:@“你好”]
尽管foo为null。在这种情况下,当代码无法加载Calculator类时,它基本上没有说什么。所有消息都被愉快地发送,但是Objective-C运行时一直在继续。