ios - 在 MonoTouch 中使用字典

标签 ios dictionary xamarin.ios aot

我对 MonoTouch 字典的限制很困惑:http://docs.xamarin.com/ios/about/limitations#Value_types_as_Dictionary_Keys

据我了解,这样的代码不允许:

var foo = new Dictionary<int, int>();

但是我在这样的书中看到代码,这没有意义:

protected Dictionary<int, CustomCellController> _cellControllers = new Dictionary<int, CustomCellController>();

另外,有人发帖说,如果您使用可空类型,它会将值转换为引用,因此以下内容有效(只要键不为空):

var foo = new Dictionary<int?, int?>();

这也没有意义,因为可空类型是属于值类型的结构。

那么在设备上使用词典的真正规则是什么?

最佳答案

由于设备上不允许 JITin,所以所有代码都必须使用 AOT(提前)编译器进行编译。

My understanding that code like this is not allowed:

此限制是关于 AOT 编译器确定运行时使用什么的困难。此类代码可能会工作,并且您会在示例中看到此类代码 - 但它也可能会失败,具体取决于您对代码所做的操作(创建 Dictionary 不是问题)。

So what are the real rules about using dictionaries on a device?

使用值类型意味着生成的代码无法共享(就像引用类型一样)。例如。使用通用Dictionaryintlong需要单独的代码,而相同的代码可以共享给 stringCustomCellController .

寻找什么Dictionary<int,int>需求不是问题(这很清楚)。然而,事情往往在内部变得复杂,例如确保权利KeyValuePair被生成。嵌套泛型也很难正确。

这就是为什么第一个一般解决方法是尝试提示 AOT 编译器需要什么。如果 AOT 编译器可以找到需要它生成所需内容的代码,那么它将在运行时可用。

下一个解决方法是尝试使用引用类型(例如 string )而不是值类型(因为这种情况对于 AOT 编译器来说更容易处理)。

最后,AOT 编译器变得越来越好(每个版本),并且不断努力减少这一(和其他)限制。因此,您在此处阅读的内容可能不适用于 3、6、12 个月...

关于ios - 在 MonoTouch 中使用字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13114488/

相关文章:

ios - Monotouch : DataSource. RowSelected() 在 TableView 中选择一行时不触发

ios - fatal error : Unexpectedly found nil while unwrapping an Optional value NSURL

ios - 如何在swift中将sql时间戳转换为日期?

ios - 针对 iPhone 6/iPhone 6 plus 优化应用

python - 删除字典项目

java - 从 Treemap 获取带有 id 的对象会引发异常

python - 像列表一样生成字典值

c# - Xamarin.IOS。代码分析——CA2123