【问题标题】:Can I achieve multiple dispatch between int and NSNumber?我可以在 int 和 NSNumber 之间实现多次调度吗?
【发布时间】:2012-01-14 12:25:18
【问题描述】:

我正在编写一些库代码,库的用户有时对哪些方法应该使用 int 以及何时使用 NSNumber 有不同的看法。我想要一些方法来设置一个方法,以便

[myObject myMethod:5];

[myObject myMethod:[NSNumber numberWithInt:5]]

以同样的方式工作。在 Java 中,自动装箱使这相对简单,但我不知道有什么方法可以在 Objective-c 中实现这一点。是否有可能完成这项工作?

【问题讨论】:

    标签: objective-c types casting type-conversion nsnumber


    【解决方案1】:

    没有。 Obj-C 没有自动装箱或方法重载。

    Obj-C 中有一个工具可以执行自动装箱/拆箱,那就是键值编码,但它不适合这种情况。

    【讨论】:

      【解决方案2】:

      简短回答:不。

      Objective-C 不支持函数/方法重载,就像在 C++ 中一样。

      通常,如果您需要支持不同的数据类型,您将创建不同的方法。
      请注意,您随后可以自己转换传递的值,因此您不必编写(复制/粘贴)相同的代码。

      例如:

      - ( void )methodWithInt: ( int )val
      {
          [ self methodWithNumber: [ NSNumber numberWithInt: val ] ];
      }
      
      - ( void )methodWithLong: ( long )val
      {
          [ self methodWithNumber: [ NSNumber numberWithLong: val ] ];
      }
      
      - ( void )methodWithNumber: ( NSNumber * )num
      {
          /* Effective code */
      }
      

      最后,一切都会被重定向到methodWithNumber方法。

      【讨论】:

      • 显然,这取决于您最终将如何处理您的号码,但总的来说,我倾向于将所有内容集中到 methodWithInt:,因为它的内存占用略少。
      • 如果您需要调用 methodWith* 数百万次,那么 methodWithInt 可能会快 10 倍(或更多),并且它可能不会在自动释放池中丢弃一百万个 NSNumber。因此,只要您确定 int 始终如此,那么作为一个库,您不知道如何调用它,应该倾向于 methodWithInt: 作为“真正的”调用。如果调用者使用自动释放的 NSNumber,那么一百万次调用的 NSNumber 的内存占用大约为 12 MB 左右。
      猜你喜欢
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多