50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

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:311755
用户头像

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

关注

评论

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

如何基于 APISIX 迭代数字智联平台

API7.ai 技术团队

api 网关 Apache APISIX 用户案例

【计算讲谈社】第十四讲|从学科融合走出的数字人,是技术变革还是应用创新?

大咖说

阿里云 吴翰清 数字人 元宇宙游戏

一个多开发虚拟环境的命令行工具——asdf

吴脑的键客

Python ruby

CodeArts如何保证客户代码和应用安全?

科技怪授

华为云

鸿蒙开发实例|对象关系映射数据库

TiAmo

华为 华为云 12月月更

Apache APISIX 玩转 Tongsuo 国密插件

API7.ai 技术团队

加密 api 网关 Apache APISIX

澜舟2022年度产品发布,抢鲜看!

澜舟孟子开源社区

人工智能

前端工程师leetcode算法面试必备-二分搜索算法(中)

js2030code

JavaScript LeetCode

CleanMyMacX2023免费版Mac清理软件

茶色酒

CleanMyMacX

数据库挖矿系列-优化器设计探索穿越之旅

阿里技术

数据库

如何用纯css代码实现太极阴阳鱼动画效果

千锋IT教育

Dimitra荣获Web3 & Blockchain企业精神奖,有望成Web3农业领导品牌

股市老人

龙蜥社区高性能存储技术 SIG 11 月运营回顾 | 龙蜥 SIG

OpenAnolis小助手

开源 高性能 存储 龙蜥社区 sig

【MyBatis】mybatis中#{}与${}的区别

No8g攻城狮

MySQL mybatis sql

【Meetup 明天见】OpenMLDB + MaxCompute:集成打通云上生态,高效构建 AI 应用

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

OpenMLDB 社区月报 | 2022年11月

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

花费半个月啃完这份滴滴Redis核心手抄本,我终于把面试官按在地上摩擦了

程序知音

Java 数据库 redis 后端技术

2022鸿蒙开发者大赛应用创新赛道收官,中国赛区21个优秀作品获奖

极客天地

前端工程师leetcode算法面试必备-二分搜索算法(下)

js2030code

JavaScript LeetCode

CleanMyMac试用版4.12.1下载教程

茶色酒

CleanMyMac X CleanMyMac X2023

活动预告 | 2022 中国开源开发者(北京)峰会

第四范式开发者社区

人工智能 机器学习 数据库 特征

用javascript分类刷leetcode3.动态规划(图文视频讲解)

js2030code

JavaScript LeetCode

列存引擎 Tianmu 如何实现 Delete?| StoneDB 研发分享 #3

StoneDB

MySQL HTAP 数据库· StoneDB 12 月 PK 榜

专访 | 刘乔升:开源是人类智力劳动最好的组织形式

第四范式开发者社区

人工智能 机器学习 数据库 开源 时序数据库

基础设施 NFTScan 正式发布 Cronos 网络 NFT 浏览器

NFT Research

区块链 NFT 数据基础设施

cleanmymac2023体验版功能讲解

茶色酒

CleanMyMac CleanMyMac X2023

从源码到架构实战,Spring Boot+Spring Cloud微服务开发笔记全分享

小小怪下士

Java spring 微服务 springboot SpringCloud

Meetup No.8 回顾 | OpenMLDB + MaxCompute:集成打通云上生态,高效构建 AI 应用

第四范式开发者社区

人工智能 数据库 开源 时序数据库 特征

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