解决NSInteger < - > NSNumber问题

Dou*_*ugW 12 iphone cocoa types objective-c

我写了一个大型社交网络iPhone应用程序,我遇到的最大问题之一是NSInteger(和所有其他NS非对象类型)不是一等公民.这个问题源于这样一个事实,显然,他们没有代表零值.

这会产生两个主要问题:

  1. 在从集合中存储/检索时,转换为NSNumber和从NSNumber转换的大量开销和不透明度.
  2. 不能代表零.通常,我希望能够表示"未设置"值.

解决此问题的一种方法是始终使用NSNumber,但这会让人非常困惑.在User模型对象中,我将有大约20个不同的NSNumber,并且没有简单的方法来判断每个是否是float,integer,bool等.

所以这是我对潜在解决方案和优点/缺点的看法.我并没有真正卖掉任何一个,所以我想我会要求反馈和/或解决这个问题.

  1. 继续使用NSInteger类型,并使用NSIntegerMax表示nil.
    PRO - 更少的内存开销
    PRO - 清除键入
    CON - NSIntegerMax并不是真的零.如果程序员不小心或不了解此约定,则无效值可能会泄漏到显示层.
    CON - 无法在没有转换的情况下将它们存储在集合中

  2. 使用NSNumber并使用匈牙利表示法指定类型(例如NSNumber fHeight,NSNumber iAge)
    PRO - 一等公民
    PRO - 无问题解决
    CON - 增加内存开销
    CON - 丢失编译器类型检查
    CON - 匈牙利表示法是有争议的

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

寻找一个有利于这些技术之一的令人信服的论据,或者我没有想到你是否有一个.


UPDATE

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

我正在添加我们发现的其他类,包括磁盘支持的LRU缓存,"Pair"对象,低内存释放池等.

享受 github - Zoosk/ZSFoundation

Lil*_*ard 5

表示nil作为a 的想法的最常见惯例NSInteger是使用该NSNotFound值.事实上,这是相同的NSIntegerMax,尽管读者往往更明显这是一个表示缺少数字的哨兵值.在很多情况下,整个Cocoa使用它.一个常见的情况是作为NSRange来自-rangeOfString:等人的返回值的位置字段.