写点什么

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

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

关注

评论

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

C++中怎么判断Qtableview一行满了自动换行

linux大本营

c++

RPM常用命令以及组合使用场景

天翼云开发者社区

c++11 实现内存缓存机制

linux大本营

内存管理 智能指针 C++11

怎样在 Gmail 中创建规则来过滤您的电子邮件

外贸IT程序客

谷歌 youtube

c++ 使用Glog 按照功能模块划分日志文件。同时,日志文件中也存有各个对应的等级,如 debug、info等日志等级

linux大本营

c++ 日志 glog

码住!Java架构师人手一份的RabbitMQ笔记

小小怪下士

Java 程序员 RabbitMQ 消息中间件

c++ 使用Glog 生成多个具有相同等级的日志文件

linux大本营

c++ 日志 glog

hyperscan hs_scratch_t 结构

linux大本营

正则表达式 C语言 存储 结构体 hyperscan

Linux查看端口是哪个进程起的

linux大本营

Linux 进程

创新实力强劲!天翼云荣获中国专利奖

天翼云开发者社区

恒拓高科 | 惊艳亮相北京军博会,首次参展获圆满成功!

WorkPlus

HarmonyOS 3.1系统隐藏的这几个小细节 你都发现了么

最新动态

c++ 推荐几个线上观测的库

linux大本营

c++

C++存储改造,如何将Oracle语句改成使用MySQL语句

linux大本营

c++ MySQL 数据库 oracle

软件测试/测试开发丨测试工具篇(附答案)

测试人

面试 软件测试 自动化测试 测试开发

c++ 使用Glog 生成多个具有相同等级的日志文件

linux大本营

c++ 日志 glog

基于Linux系统的PXE搭建方法

天翼云开发者社区

模型服务,支持渲染多张输出图片|ModelWhale 版本更新

ModelWhale

云计算 数据标注 数学模型 在线编程 数据门户

http 多交易事务

linux大本营

HTTP

聊点技术 | 架构瘦身,让Bonree ONE跑得更轻

博睿数据

智能运维 博睿数据 一体化智能可观测 ONE有引力

初始化列表的形式完成类的成员变量的初始化,防止类型收窄,用main 函数举例说明

linux大本营

c++ namespace 构造函数

Gmail 推出与聊天、空间和会议应用程序集成的新设计

外贸IT程序客

用c++lamda函数计算阶乘

linux大本营

c++

websocket如何走网关

linux大本营

TCP websocket

Gmail 功能大全:您了解所有这些功能吗?

外贸IT程序客

c++11 分边在两个map中执行相同操作,代码如何优化

linux大本营

c++ map

c++11 map遍历 条件匹配,else

linux大本营

map C++11

织密“安全云网”,天翼云探索构建分布式多场景云服务稳定性保障体系!

天翼云开发者社区

河北电信“天翼云开放实验室”在雄安揭牌,加速算力资源落地!

天翼云开发者社区

c++ 读取数据库文件后将数据缓存到内存中直到服务重启

linux大本营

c++ map stl C++ STL

git 如何在本地有更改的情况下,使用命令获取远端最新代码

linux大本营

git

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