Eik*_*iko 10
数字是一种非常基本的数据类型.一个数字就是 - 一个数字.如果你改变它,它恰好是其他东西.一个数字根本无法改变.
将其与更复杂的数据进行比较,其中对象本身仍然代表相同的事物.
900*_*000 10
不可变数字可节省空间.假设你的程序创建了许多NSNumbers,并且大多数都是0或1之类的小数字.对于不可变数字,你只需要一个少数对象,每个对应一个不同的值.使用可变数字,您拥有与数字一样多的对象.
不可变数字很容易分享.假设你用一个原始数字(如int)包装NSNumber.对于不可变NSNumber,编译器始终确保值匹配,因此它可以解包并将原始值传递给期望原始值的函数.使用mutable NSNumber,你不能确定另一个线程没有改变值,并且每次都必须实际解开它,甚至考虑同步.如果在嵌套调用中进一步传递该值,则会变得更加昂贵.
不可变对象具有许多其他有用的属性:它们是良好的散列键,它们的生命周期和范围更容易确定等.许多函数语言,例如Erlang或XSLT,只有不可变的数据结构.
Eiko提出了一个很好的观点:NSNumber代表了一种基本的数据类型,让它变得可变是没有意义的.
这就像有一个int i=0;并且问为什么0不可变.在OS X Lion x64中,它正是整数,因为NSNumbers是作为标记指针实现的,它是包含数据而不是地址的指针.
例如,假设我们要将整数42存储在指针中.我们可以创建一个NSNumber然后指向它,或者我们可以用42替换地址,在这种情况下我们可以跳过对象创建.但是,我们如何判断我们是在处理公共指针还是标记指针?
x86 64指针有64位,但指针地址只使用48位.原因是48位提供了256 TB的地址空间,这是很多.使用64位将是浪费,因为它需要CPU中更多的晶体管.因此潜在的地址空间是64位,但是当前的CPU只能使用48.因此,指针的结束位为0,因为它们未被使用.我们使用这些最后一位来指示指针是一个标记指针,表示具有给定位数的整数.
因此,表示整数的OS X NSNumber实际上只是一个整数,但运行时能够将其检测为标记指针并将其作为公共实例呈现给用户.
对于其他数字类型,实现方式更复杂,如NSNumber免费核心基金会对应CFNumber所示.
| 归档时间: |
|
| 查看次数: |
3920 次 |
| 最近记录: |