写点什么

Xamarin 到 64 位 iOS/OSX 平台的粗野过渡

  • 2013-11-18
  • 本文字数:911 字

    阅读完需:约 3 分钟

当 Xamarin 开始自己的 iOS 项目的时候,设备仅能够在 32 位模式下使用,也就是 32 位版本的 NSInteger 和 CGFloat。当他们开始调查 64 位 OSX 的时候,他们意识到自己对那些数据类型的假设是错误的。 Miguel 继续说

我们将需要审计我们的所有 API 从而实现合适的类型映射,同时我们将破坏源码的兼容性,使用类似于下面的代码:

复制代码
var foo = new Xxx ();
int count = foo.GetRowCount ();
// oops, can not cast a long into an int.

当我们把源码的破坏和 Apple 拥有一个 32 位兼容性故事,同时我们仅有一些遗留类库依赖于 32 位 API 的事实结合起来的时候,我们意识到我们并不急于转移到 64 位的世界。

随着仅能引入 64 位类库的 Mountain Lion 的出现,他们看到了改变这种设计的需要。而 Apple 提供 32 位和 64 位版本的 iPhone 5 的决定进一步加剧了这种局面。为了处理这些新的挑战,Xamarin 已经创建了三个新的数据类型:

  • nint
  • nuint
  • nfloat

这些新的结构被定义为 32 位或者 64 位,依赖于代码编译的目标平台。但是故事的内容远不止如此。原始的数学运算使用特殊的 IL 指令进行操作(例如加法),而用户定义的结构需要调用 op_Addition 方法。

对于性能敏感的代码而言这可能会引发一些小的但是值得注意的影响。因为在使用本地类库的时候这些类型是非常基础的,AOT 编译器会被修改为重新解释使用这些类型的操作。Miguel 继续说:

op_Addition 调用最终会和本地 ECMA CIL add 指令一样。IL 可能看起来很恐怖,但是本地代码也是如此。

一些人可能会想知道为什么 Xamarin 不使用 IntPtr——支持平台特定整数的 CLR 数据类型。Miguel 写道:

我们选择了 nint 和 nuint 而不是内置的 IntPtr 和 UIntPtr,因为前者让人感觉是自然的“原生整型”,而 IntPtr 则是文化相关的,它已经有指针或者一个本地符号。另外,我们并没有等价的本地浮点类型。

我们选择避免使用名称 NSInteger 和 CGFloat 有几个方面的原因:一般情况下功能已经足够,它们可能值得在 Mono 中用于除了 Mac 和 iOS 之外的地方;同时感觉这些是真正的 VM 支持的类型,而不是一些类型定义或者别名。在理想的情况下,这些最终会成为 C#标准的一部分。

查看英文原文 Xamarin’s Rough Transition to 64-bit iOS/OSX

2013-11-18 05:311456
用户头像

发布了 321 篇内容, 共 123.0 次阅读, 收获喜欢 19 次。

关注

评论

发布
暂无评论
发现更多内容

[架构实战营] 模块九作业

Geek_0ed632

「架构实战营」

《人月神话》第十七章阅读笔记:再论“没有银弹”

panda

人月神话 阅读笔记 没有银弹

朋友圈高性能复杂度分析

风中奇缘

架构实战营 「架构实战营」

模块二作业

Geek_ec866b

架构实战营

无人管的 InfoQ 每周精选

scruel

InfoQ

跨平台移动APP开发进阶(二):HTML5+、mui开发移动app教程

No Silver Bullet

跨平台 2月月更 mui

欢迎客户支持自动化领域的新兴领导者 Percept.AI 加入 Atlassian 大家庭!

Atlassian

敏捷 Atlassian Jira JiraServiceManagement 客户服务

作业七-王者荣耀商城异地多活架构设计

曾竞超

架构实战营 「架构实战营」

渗透利器 | 常见的WebShell管理工具

喀拉峻

网络安全

给 zsh 自定义命令添加参数自动补全

mzlogin

Shell zsh

华为云IoT体验:基于IoT平台构建智慧路灯应用

乌龟哥哥

2月月更

真正的Kafka多线程消费

dinstone

kafka 多线程 并发消费

Linux之iostat命令

入门小站

简析Web3 架构:前端、后端和数据

devpoint

区块链 dapp Solidity Web3.0 2月月更

模块 7 作业

miliving

开杠面试官-微信朋友圈高性能架构

晨亮

「架构实战营」

微信朋友圈高性能架构分析

IT屠狗辈

架构 高性能 微信朋友圈 架构实战营

《人月神话》第十九章阅读笔记:20年后的《人月神话》

panda

人月神话 概念完整性 阅读笔记

Web Components 系列(五)—— 详解 Slots

编程三昧

前端 组件化 2月月更 WebComponent

《人月神话》第十六章阅读笔记:没有银弹

panda

人月神话 阅读笔记 没有银弹

微信朋友圈业务架构分析

Geek_1b4338

#架构实战营 「架构实战营」

每天都扫的二维码,你知道它的技术原理吗?

慕枫技术笔记

后端 2月月更

自省与反思(一)

懒时小窝

反思 反思总结

基于 SAP BTP 平台的 AI 项目经验分享 | 社区征文

汪子熙

人工智能 机器学习 AI 新春征文 2月月更

Go 语言入门很简单:String

宇宙之一粟

Go 语言 2月月更

微信朋友圈的高性能复杂度

smile

架构实战营

微信朋友圈高性能复杂度分析

「架构实战营」

[JAVA冷知识]JAVA居然可以多继承吗?让我们用内部类去实现吧!

山河已无恙

Java 2月月更

模块二作业

blazar

「架构实战营」

深入浅出 ESM 模块 和 CommonJS 模块

局外人

JavaScript node.js 前端 前端开发 模块化

程序员,如何避免无效会议?

蜜糖的代码注释

2月月更

Xamarin到64位iOS/OSX平台的粗野过渡_语言 & 开发_Jonathan Allen_InfoQ精选文章