gpt4 book ai didi

iphone - 解决 NSInteger <-> NSNumber 问题

转载 作者:太空狗 更新时间:2023-10-30 03:22:03 24 4
gpt4 key购买 nike

我编写了一个大型社交网络 iPhone 应用程序,我遇到的最大问题之一是 NSInteger(以及所有其他 NS 非对象类型)不是一等公民。这个问题源于这样一个事实,很明显,它们没有 nil 值的表示。

这产生了两个主要问题:

  1. 在从集合中存储/检索时,与 NSNumber 之间的转换会带来大量开销和不透明性。
  2. 不能代表零。通常,我希望能够表示一个“未设置”的值。

解决这个问题的一种方法是始终使用 NSNumber,但这会变得非常困惑。在一个 User 模型对象中,我将有大约 20 个不同的 NSNumber,并且没有简单的方法来判断每个是 float 、整数、 bool 值等。

下面是我对潜在解决方案的看法以及优缺点。我对它们中的任何一个都不感兴趣,所以我想我会征求反馈和/或解决这个问题的替代方案。

  1. 继续使用 NSInteger 类型,只使用 NSIntegerMax 来表示 nil。
    PRO - 更少的内存开销
    专业版 - 清晰打字
    缺点 - NSIntegerMax 并非真的为零。如果程序员不小心或不知道此约定,无效值可能会泄漏到显示层。
    缺点 - 如果不进行进出转换,就无法将它们存储在集合中

  2. 使用 NSNumber 并使用匈牙利符号指定类型(例如 NSNumber fHeight、NSNumber iAge)
    PRO - 一等公民
    PRO - 没有解决问题
    缺点 - 增加内存开销
    CON - 丢失编译器类型检查
    缺点 - 匈牙利符号有争议

  3. 编写我自己的一流原始对象类型(想想 Java http://developer.android.com/reference/java/lang/Integer.html)
    PRO - 一等公民
    PRO - 没有解决问题
    PRO - 保持编译器类型检查
    PRO - 对象将比 NSNumber 更简单。内部存储将特定于数据类型。
    缺点 - 增加内存开销
    缺点 - 牺牲了一些代码的可移植性和兼容性

正在寻找支持其中一种技术的令人信服的论据,或者如果您有的话,我还没有想到。


更新

我已经开始了一个开源项目 (Apache 2.0),我将在有空的时候将我们的一些内部类引入其中。它目前包括一些更常见的 native 数据类型(BOOL、CGFloat、NSInteger、NSUInteger)的对象包装器。我们选择这样做是因为它将这些数据类型升级为具有严格类型的一等公民。也许您不同意这种方法,但它对我们来说效果很好,所以如果您愿意,请随意使用它。

我正在添加我们发现的其他用途的类,包括磁盘支持的 LRU 缓存、“Pair”对象、低内存释放池等。

享受 github - Zoosk/ZSFoundation

最佳答案

nil 表示为NSInteger 的最常见约定是使用NSNotFound 值。事实上,这等于 NSIntegerMax,尽管对于读者来说,这是一个表示缺少数字的标记值,但它往往更明显。在很多情况下,它在整个 Cocoa 中都被使用。一种常见的情况是将 NSRange 的位置字段作为 -rangeOfString: 等的返回值。

关于iphone - 解决 NSInteger <-> NSNumber 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4684216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com