C# 在MonoTouch中绑定本机库:可行,但为什么子类化时会出现奇怪的结果?缺少NullAllowed属性?
MonoTouch 5.2.13 我通过MonoTouch绑定使用原生Objective库。该库公开一个视图控制器。在我将视图控制器子类化之前,一切正常。然后,我得到空引用异常或部分UI未显示 我已经读过关于btouch工具和“-e”选项的问题。但据我所见,这一选择并不存在: 工具/Developer/MonoTouch/usr/bin/b触摸执行开始于 参数:/d:DEBUG ApiDefinition.cs/s:StructsAndEnums.cs /tmpdir:obj/Debug/ios//sourceonly:obj/Debug/ios//sources.list 子类(在本例中)没有添加任何功能,但使用它就足以破坏绑定:C# 在MonoTouch中绑定本机库:可行,但为什么子类化时会出现奇怪的结果?缺少NullAllowed属性?,c#,objective-c,ios,xamarin.ios,subclass,C#,Objective C,Ios,Xamarin.ios,Subclass,MonoTouch 5.2.13 我通过MonoTouch绑定使用原生Objective库。该库公开一个视图控制器。在我将视图控制器子类化之前,一切正常。然后,我得到空引用异常或部分UI未显示 我已经读过关于btouch工具和“-e”选项的问题。但据我所见,这一选择并不存在: 工具/Developer/MonoTouch/usr/bin/b触摸执行开始于 参数:/d:DEBUG ApiDefinition.cs/s:StructsAndEnums.cs /tmpdir:obj/Debug/ios
// Works.
var contr = new NativeController();
// Fails with various errors. Throws a NULL reference exception about some UIPopoverController being NULL, for instance.
public class SubclassedController : NativeController
{
public SubclassedController() : base()
{
}
}
var contr = new SubclassedController();
我发现将[NullAllowed]添加到属性解决了空引用异常
本机控制器公开一个属性(非原子、强)UIPopoverController*popoverController
。这被绑定为UIPopoverController-PopoveController{get;set;}
——在这里添加NullAllowed
解决了这个问题
但现在我面临的问题是图像无法显示,也没有明显的例外
我假设这些问题也源于这样一个事实,即当使用子类版本时,有些东西是空的,但是本机代码似乎会对空作出反应并优雅地处理它
这导致了三个问题:
- 为什么使用子类化时行为不同?MonoTouch是如何做到这一点的?为什么在使用派生类的情况下会得到NULL ref?无论哪种情况,我都没有碰过超控器
- 如果没有错误,我如何找出错误以及如何修复它
- 除此之外,还有什么需要注意的呢
b触摸
,帮助您为Objective-C库创建绑定。这是Xamarin用来制作所有iOS绑定的相同的工具
还不确定吗?写一个小的Objective-C示例,它也能做到这一点。将结果与MonoTouch版本进行比较
不同的结果?用(C#和ObjC)两个测试用例填充一个测试用例,我们将检查发生了什么(如前所述,我们有充分的理由确保b触摸
没有bug;-)
为什么在使用派生类的情况下会得到NULL ref?无论哪种情况,我都没有碰过超控器
如果没有错误,我如何找出错误以及如何修复它
除此之外,还有什么需要注意的呢
在此阶段,您将运行绑定库的本机代码。您需要遵循的具体规则如下:
- 阅读图书馆文献李>
- 读取库源(如果可用)、标题和示例李>
- 对于
您可以测试(例如单元测试)是否允许[NullAllowed]
(例如,它是否会崩溃)李>null
b触摸
,帮助您为Objective-C库创建绑定。这是Xamarin用来制作所有iOS绑定的相同的工具
还不确定吗?写一个小的Objective-C示例,它也能做到这一点。将结果与MonoTouch版本进行比较
不同的结果?用(C#和ObjC)两个测试用例填充一个测试用例,我们将检查发生了什么(如前所述,我们有充分的理由确保b触摸
没有bug;-)
为什么在使用派生类的情况下会得到NULL ref?无论哪种情况,我都没有碰过超控器
如果没有错误,我如何找出错误以及如何修复它
除此之外,还有什么需要注意的呢
在此阶段,您将运行绑定库的本机代码。您需要遵循的具体规则如下:
- 阅读图书馆文献李>
- 读取库源(如果可用)、标题和示例李>
- 对于
您可以测试(例如单元测试)是否允许[NullAllowed]
(例如,它是否会崩溃)李>null
此外,移植现有示例既是一个很好的学习练习(库API),也是一种快速测试绑定错误(例如选择器中的输入错误、错误的参数…)的方法。这个具体问题有两个方面:
UIPopoverController的
属性缺失NullAllowed
- MonoTouch 5.2.13中的一个bug,与绑定无关,但与CoCoTouch有关。特定的